C++ 大整数宝宝加加乐(九度OJ 1198)

来源:互联网 发布:js判断第一次进入页面 编辑:程序博客网 时间:2024/05/01 17:54

题目描述:

实现一个加法器,使其能够输出a+b的值。

输入:

输入包括两个数a和b,其中a和b的位数不超过1000位。

输出:

可能有多组测试数据,对于每组数据,
输出a+b的值。

样例输入:
2 610000000000000000000 10000000000000000000000000000000
样例输出:
810000000000010000000000000000000

源代码:

#include <iostream>#include <string.h>#include <cstdio>using namespace std;void reverse(char *s)                //字符串逆置{    int i=0,j=strlen(s)-1;    char t;    while(i<j)    {        t=*(s+i);        *(s+i)=*(s+j);        *(s+j)=t;        i++,j--;    }}void add(char *num1,char *num2,char *result)        //大整数相加{    int i,t;    int acc=0;                      //进位标记    int length1=strlen(num1);       //获取两个大整数的长度    int length2=strlen(num2);    reverse(num1);                  //先将两个大整数逆置,从个位数开始一位一位相加,并考虑进位    reverse(num2);    for(i=0;i<length1 && i<length2;i++)        //两个大整数的每一位都有数字存在    {        t=num1[i]-'0'+num2[i]-'0'+acc;        result[i]=t%10+'0';        if(t>=10)            acc=1;        else            acc=0;    }    if(i<length1)                              //两个大整数位数不同,此时第一个数位数多    {        for( ;i<length1;i++)        {            t=num1[i]-'0'+acc;            result[i]=t%10+'0';            if(t>=10)                acc=1;            else                acc=0;        }    }    if(i<length2)                              //两个大整数位数不同,此时第二个数位数多    {        for( ;i<length2;i++)        {            t=num2[i]-'0'+acc;            result[i]=t%10+'0';            if(t>=10)                acc=1;            else                acc=0;        }    }    if(acc==1)                                 //如果两数之和存在进位,需在存结果的字符数组result中补'1'        result[i++]='1';    reverse(result);}void output(char *s)                           //输出最终结果{    printf("%s\n",s);}int main(){    char num1[1000],num2[1000];    char result[100000];    while(scanf("%s %s",num1,num2)!=EOF)       //多组输入两个大整数    {        for(int i=0;i<100000;i++)              //每次相加前将存结果的字符数组result已存入的字符“清空"            result[i]=0;        add(num1,num2,result);        output(result);    }    return 0;}

程序截图:

PS:

        这里输入的a.b两只宝宝并不仅仅局限于平时习惯的a.b不超出精度范围的情况,因此需全面考虑,从位数出发,将a.b宝宝存入最大长度为1000的字符数组,然后用result字符数组存结果,并且对两只宝宝先逆置再将最终结果逆置可以从宝宝们的个位开始一位一位相加,并考虑进位,更形象直观。
        受某萌宝宝的启发,尝试研究了此问题,收获甚多~ 以上代码中大整数相加过程参考了CSDN上的解法,并加上了自己的理解与分析过程完成,yeah
0 0