求助各位大佬,60分,C++

P1957 口算练习题

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;
    }   

因为如果写在里面的话每次循环都会算一次,浪费时间


|