penguin_cpp @ 2021-02-26 10:54:31
样例:
4
a 64 46
275 125
c 11 99
b 46 64
程序输出:
64+46=110
9
2702+125=2827
13
11*99=1089
10
46-64=-18
9
好端端的 275 咋就成了 2702 了呢? 代码献上:
#include <iostream>
#include <cstdio>
using namespace std;
struct yunsuan
{
string yunsuanfu; // 运算符,第一个输入的数字
int d2,d3; // 第二个和第三个输入的运算数字
};
int main()
{
/* 定义部分 */
int n; // n 行
yunsuan ys[55]; // 定义 yunsuan 结构体输入 ys
int jieguo; // 运算结果
int b=0; // 计数器 ,字符数
/* 输入部分 */
cin>>n; // 输入 n
for(int i=0; i<n; i++) // 输入 n 行部分
{
cin>>ys[i].yunsuanfu>>ys[i].d2; // 输入 ys[i].yunsuanfu 和 ys[i].d2
if(getchar()=='\n') // 如果换行了
{
ys[i].d3=ys[i].d2; // 将 ys[i].d3 赋值为 ys[i].d2
ys[i].d2=0; // 将 ys[i].d2 清零,不影响 for 内部乘 10
for(int k=0; k<sizeof(ys[i].yunsuanfu); k++)
{
ys[i].d2*=10;
ys[i].d2+=ys[i].yunsuanfu[k]-48;
} // 将 ys[i].d2 赋值为 ys[i].yunsuanfu 的数字
ys[i].yunsuanfu=ys[i-1].yunsuanfu;
continue; // 跳出本次循环
}
cin>>ys[i].d3; // 否则,输入 ys[i].d3
}
/* 输出部分 */
for(int i=0; i<n; i++)
{
b=2; // + 和 = 用的空间
cout<<ys[i].d2; // 第一个运算数字
switch(ys[i].yunsuanfu[0])
{
case 'a':cout<<'+';jieguo=ys[i].d2+ys[i].d3;break;
case 'b':cout<<'-';jieguo=ys[i].d2-ys[i].d3;break;
case 'c':cout<<'*';jieguo=ys[i].d2*ys[i].d3;break;
} // 运算符,结果
cout<<ys[i].d3; // 第二个运算数字
cout<<'='; // =号
cout<<jieguo<<endl; // 结果,换行
do
{
ys[i].d2/=10;
b++;
}while(ys[i].d2!=0); // 第一个运算数字用的空间
do
{
ys[i].d3/=10;
b++;
}while(ys[i].d3!=0); // 第二个运算数字用的空间
if(jieguo<0) // 如果结果小于0
b++; // 一定有 - 号
do
{
jieguo/=10;
b++;
}while(jieguo!=0); // 结果用的空间
cout<<b<<endl; // 输出字符数
}
return 0;
}
感觉问题是在
for(int k=0; k<sizeof(ys[i].yunsuanfu); k++)
{
ys[i].d2*=10;
ys[i].d2+=ys[i].yunsuanfu[k]-48;
} // 将 ys[i].d2 赋值为 ys[i].yunsuanfu 的数字
看了好长时间死活看不出来(可能是我太菜了...) 有木有能看出来的大佬,help!
by tribool4_in @ 2021-02-26 11:13:42
建议使用getline一次读一行
by Dzhao @ 2021-02-26 11:14:33
k<sizeof(ys[i].yunsuanfu)
???长度是strlen
by 指挥的智慧 @ 2021-02-26 11:15:44
我这里程序你的程序输出为 64+46=110
9
26966672+125=26966797
21
11*99=1089 10
46-64=-18
9
by tribool4_in @ 2021-02-26 11:16:12
他是用的string,应为ys[i].yunsuanfu.size()
by tribool4_in @ 2021-02-26 11:19:59
@东明李承洋 改过的代码:https://www.luogu.com.cn/paste/w5o0r0z7
by 指挥的智慧 @ 2021-02-26 11:33:06
改成ys[i].yunsuanfu.length();也行
by 指挥的智慧 @ 2021-02-26 11:37:01
还有一件事 我建议写成这样
int op=ys[i].yunsuanfu.length();
for(int k=0;k<op;k++)
{
ys[i].d2*=10;
ys[i].d2+=ys[i].yunsuanfu[k]-48;
}
因为如果写在里面的话每次循环都会算一次,浪费时间