用switch的case1调用一个子函数之后再用case2调用第二个子函数答案就出错了,第一个没错,怎么解决?

新手上路,请多包涵

大数的四则运算

老师出题。自己的想法就是用一个主函数调用多个子函数分别运算结果,子函数没问题,应该是调用问题。

相关代码

// #include<stdio.h>

include<string.h>

include<iostream>

include <algorithm>

include<string>

using namespace std;
int main()
{

char o;
int jia();
int jian();
int cheng();
int chu();
 while(cin>>o)
 {
      switch(o)
    {
        case '+': jia();break;
        case '-': jian();break;
        case '*': cheng();break;
        case '/': chu();break;
    }
 }

return 0;

}

int jia()
{

int x[100]={0},y[100]={0},z[105]={0};//将数组元素全部初始化为0
char a[100], b[100];//通过字符串对大数进行输入并储存
int len1,len2,len;
while(scanf("%s %s",a,b))
{
    int i,j=0,k=0;
    len1=strlen(a);
    len2=strlen(b);
    for(i=len1-1;i>=0;i--)//将两个字符串中的字符转化为数字,并倒序储存到数组中,即字符串为123456,则数组为654321
    {
        x[j]=a[i]-'0';
        j++;
    }
    for(i=len2-1;i>=0;i--)
    {
        y[k]=b[i]-'0';
        k++;
    }
    if(len1>len2)
        len=len1;
    else
        len=len2;
    i=0;//从最低位(个位)开始进行计算
    int m=0;
    for(i=0;i<len;i++)
    {
        z[i]=(x[i]+y[i]+m)%10;//将所得数的个位存到数组z[i]中去
        if((x[i]+y[i]+m)>=10)
            m=1;
        else
            m=0;
    }
    if((x[i-1]+y[i-1]+m)>=10)//判断运算的最大位的和是否>=10
        z[i]=1;
    else
        i=i-1;
    for(;i>=0;i--)//到序输出数组
        printf("%d",z[i]);
    printf("\n");
}

return 0;
}

void sub(int x[],int y[],int len)
{

int z[105]={0};
int i;
for(i=0;i<len;i++)
{
    if(x[i]>=y[i])//如果x[i]>=y[i],不用向前一位借1,可直接减
        z[i]=x[i]-y[i];
    else  //如果x[i]<y[i],向前一位借1,同时前一位应减1
    {
        z[i]=x[i]+10-y[i];
        x[i+1]=x[i+1]-1;
    }
}
for(i=len-1;i>0;i--)//删除前缀0
{
    if(z[i]==0)
        len--;
    else
        break;
}
for(i=len-1;i>=0;i--)  //倒序输出数组
    printf("%d",z[i]);
printf("\n");

}
int jian()
{

int x[100]={0},y[100]={0};//将数组元素全部初始化为0
char a[100],b[100];//通过字符串对大数进行输入并储存
int len1,len2;
while(scanf("%s %s",a,b))
{
    int i,j=0,k=0;
    len1=strlen(a);
    len2=strlen(b);
    for(i=len1-1,j=0;i>=0;i--)//将两个字符串中的字符转化为数字,并倒序储存到数组中,即字符串为123456,则数组为654321
        x[j++]=a[i]-'0';
    for(i=len2-1,k=0;i>=0;i--)
        y[k++]=b[i]-'0';
    if(len1>len2)  //若减数长度 > 被减数,正常减
        sub(x,y,len1);
    else if(len1<len2)  //若减数长度 < 被减数,被减数 减 减数
    {
        printf("-");
        sub(y,x,len2);
    }
    else  //若减数长度 == 被减数,判断两个数的大小
    {
        for(i=len1-1;i>=0;i--)//判断每一位两个数的大小
        {
            if(x[i]==y[i])
                continue;
            if(x[i]>y[i])//即减数大
            {
                sub(x,y,len1);
                break;
            }
            if(x[i]<y[i])//即被减数大
            {
                printf("-");
                sub(y,x,len1);
                break;
            }
        }
    }
}
return 0;

}

int cheng()
{

string multi(const string&a,const string&b);
for(string a,b;cin>>a>>b&&(a!="0"||b!="0");)
    cout<<multi(a,b)<<"\n";
return 0;

}
string multi(const string&a,const string&b)
{

if(a=="0"||b=="0") return "0";
string aa(a[0]=='-' ? a.substr(1) :a);
string bb(b[0]=='-' ? b.substr(1) :b);
string sign=((a[0]=='-')+(b[0]=='-')==1 ? "-" : "");
string s(aa.length()+bb.length(),'0');
reverse(aa.begin(),aa.end());
reverse(bb.begin(),bb.end());
for(int j=0;j<bb.length();++j)
{
    if(bb[j]=='0') continue;
    int temp=0;
    for(int i=0;i<aa.length();++i)
    {
        temp+=(aa[i]-'0')*(bb[j]-'0')+(s[j+i]-'0');
        s[j+i]=temp%10+'0';
        temp/=10;
    }
    s[aa.length()+j]+=temp;
}
reverse(s.begin(),s.end());
return sign+s.substr(s.find_first_not_of('0'));

}

char a[100],b[100];//用两个字符串用来输入两个大数
int x[100],y[100],z[100],m[100];//被除数 除数 商 余数
int digit;//大数的位数
void sub(int x[],int y[],int len1,int len2)//大数减法
{

int i;
for(i=0;i<len1;i++)
{
    if(x[i]<y[i])
    {
        x[i]=x[i]+10-y[i];
        x[i+1]--;
    }
    else
        x[i]=x[i]-y[i];
}
for(i=len1-1;i>=0;i--)//判断减法结束之后,被除数的位数
{
    if(x[i])
    {
        digit=i+1;
        break;
    }
}

}
int judge(int x[],int y[],int len1,int len2)
{

int i;
if(len1<len2)
    return -1;
if(len1==len2)//若两个数位数相等
{
    for(i=len1-1;i>=0;i--)
    {
        if(x[i]==y[i])//对应位的数相等
            continue;
        if(x[i]>y[i])//被除数 大于 除数,返回值为1
            return 1;
        if(x[i]<y[i])//被除数 小于 除数,返回值为-1
            return -1;
    }
    return 0;//被除数 等于 除数,返回值为0
}

}
int chu()
{

int i,j=0,k=0,temp;
int len1,len2,len;//len两个大数位数的差值
while(~scanf("%s %s",a,b))
{
    len1=strlen(a);//被除数位数
    len2=strlen(b);//除数位数
    for(i=len1-1,j=0;i>=0;i--)//将字符串中各个元素倒序储存在数组中
        x[j++]=a[i]-'0';
    for(i=len2-1,k=0;i>=0;i--)
        y[k++]=b[i]-'0';
    if(len1<len2)//当被除数位数 小于 除数位数时
    {
        printf("商是:0\n");
        printf("余数是:");
        puts(a);
    }
    else //当被除数位数 大于或者 除数位数时
    {
        len=len1-len2;//两个大数位数的差值
        for(i=len1-1;i>=0;i--)//将除数后补零,使得两个大数位数相同。被除数:4541543329 除数:98745,加零后:9874500000
        {
            if(i>=len)
                y[i]=y[i-len];
            else
                y[i]=0;
        }
        len2=len1;//将两个大数数位相同
        digit=len1;    //将原被除数位数赋值给digit
        for(j=0;j<=len;j++)
        {
            z[len-j]=0;
            while(((temp=judge(x,y,len1,len2))>=0)&&digit>=k)//判断两个数之间的关系以及位数与除数原位数的关系
            {
                sub(x,y,len1,len2);    //大数减法函数
                z[len-j]++;//储存商的每一位
                len1=digit;//重新修改被除数的长度
                if(len1<len2&&y[len2-1]==0)
                    len2=len1;//将len1长度赋给len2;
            }
            if(temp<0)//若被除数 小于 除数,除数减小一位。例如:被除数:4541543329 除数:(原)98745,(加零后)9874500000,后退一位后:0987450000
            {
                for(i=1;i<len2;i++)
                    y[i-1]=y[i];
                y[i-1]=0;
                if(len1<len2)
                    len2--;
            }
        }
        printf("商是:");
        for(i=len;i>0;i--)//去掉前缀0
        {
            if(z[i])
                break;
        }
        for(;i>=0;i--)
            printf("%d",z[i]);
        printf("\n");
        printf("余数是:");
        for(i=len1;i>0;i--)
        {
            if(x[i])
                break;
        }
        for(;i>=0;i--)
            printf("%d",x[i]);
        printf("\n");
    }
}
return 0;

}

运行输入+,然后输入1 1,显示2;再输入-,输入1 1,显示的是-2,而不是0.

阅读 2.8k
1 个回答

因为你再输入-,则a[0]则是-的值,即45,如下图
clipboard.png
然后转换为x变为-3,如下图
clipboard.png
所以x+y=-3+1-2,根本原因是1 1并没有传给你期望的减法两个输入,而是-1传给了加法,使用调试单步执行,很容易就找出错误了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题