a+b和a-b

来源:互联网 发布:淘宝售后客服几点上班 编辑:程序博客网 时间:2024/04/29 12:58

问题 P: a+b和a-b

时间限制: 1 Sec 内存限制: 128 MB

提交: 4 解决: 2

题目描述

给你两个数a和b,让你计算a和b的和或者差。

输入

有t组数据,每组数据输入一个正数a,接着输入一个符号('+'或者'-'),再输入一个正数b。

a和b的位数都小于100位。

输出

若是'+',输出两个数之和,若是'-',输出两数之差。

样例输入

412345 + 1234512345 + 352345 - 1234512 - 123

样例输出

2469012380-10000-111

提示

注意:a和b很大,用int或者long long无法存储。

这是我看别人写的大数乘法,比葫芦画瓢写的加减法,总体来说算是比较基础的,需要注意的地方是加法进位和减法借位的操作

#include<stdio.h>

#include<string.h>
#include<algorithm>
using namespace std;
char s[130],r[130],sign;

int sint[130],cint[130],sum[130];

int len1,len2;
void add(int flag)
{
        for(int i=0;i<flag;i++)
        {
            sum[i]=sint[i]+cint[i];//模拟加法操作,不管有多大,该位相加时候大于10,先存起来,下面在做进位的操作
        }
        for(int i=0;i<flag;i++)
        {
            if(sum[i]>=10)
            {
                sum[i+1]+=sum[i]/10;//这里就是进位操作了
                sum[i]%=10;
            }
        }
        if(sum[flag]>0) flag++;//当然你需要注意的是一个3位的数加上一个1位的数,可能等于4位的数,所以要看一下较高一位是否大于0
        for(int i=flag-1;i>=0;i--)
        {
            printf("%d",sum[i]);
        }
        printf("\n");
}
void cut(int flag)
{
        if(flag==len1)//减法其实和加法的道理一样,这里如果是大减小肯定是大于零的,只需要注意借位的问题即可
        {
            for(int i=0;i<flag;i++)
            {
                sum[i]=sint[i]-cint[i];
            }
            for(int i=0;i<flag;i++)
            {
                if(sum[i]<0)
                {
                    sum[i+1]--;
                    sum[i]+=10;
                }
            }
            if(sum[flag-1]==0) flag--;
            for(int i=flag-1;i>=0;i--)
            {
                printf("%d",sum[i]);
            }
            printf("\n");
        }
        else//然而到了这里就是小减去大的了,但是我们还让它用大的减去小的,然后在前面加一个负号即可
        {
            for(int i=0;i<flag;i++)
            {
                sum[i]=cint[i]-sint[i];
            }
            for(int i=0;i<flag;i++)
            {
                if(sum[i]<0)
                {
                    sum[i+1]--;
                    sum[i]+=10;
                }
            }
            if(sum[flag-1]==0) flag--;
            printf("-");
            for(int i=flag-1;i>=0;i--)
            {
                printf("%d",sum[i]);
            }
            printf("\n");
        }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {

        scanf("%s %c%s",s,&sign,r);//这里在%c前加一个空格是为了防止sign吸收输入字符串%s结尾的回车,当然很多人喜欢用getchar()吸收,具体用法自行百度

        len1=strlen(s);

        len2=strlen(r);
        int flag=len1>len2?len1:len2;//flag记录两者最长的那个字符长度,是为了在减法运算的时候,让大的减去小的,这样就不会在用数组模拟的时候出现麻烦
        int j=0;
        memset(sint,0,sizeof(sint));
        memset(cint,0,sizeof(cint));
        memset(sum,0,sizeof(sum));//记得每次要清零哦,有个好习惯哈
        for(int i=len1-1;i>=0;i--,j++)
        {
            sint[i]=s[j]-'0';
        }
        j=0;
        for(int i=len2-1;i>=0;i--,j++)
        {
            cint[i]=r[j]-'0';
        }
        if(len1==len2)
        {
            if(strcmp(s,r)==1) flag=len1;//即使是在减法里两个字符串的长度一样,但是依旧无法判断大小,但是我们学过#include<string.h>头文件里得到strcmp()函数,用来比较两个字符串的大小,这是一位一位比较的,比如abc就比ABCD大,所以刚开始要比较一下字符串的长度
            else flag=len2;
        }
        if(sign=='+') add(flag);
        else cut(flag);
    }
    return 0;

}

//若有错误,还望各位读者指出,谢谢

2 0
原创粉丝点击