题目描述
给出两个 200 位以内的正整数,求其和。
输入描述
多组测试数据。每组测试数据包括两行,每行一个数。
输出描述
每组测试输出一行,为所求两个整数之和。
样例输入
123
456
样例输出
579
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char b1[210]={'\0'},b2[210]={'\0'};
//printf("shu ru :\n");
while(~scanf("%s %s",b1,b2))
{
int a1[210]={0},a2[210]={0},a3[210]={0},i,j,x,y;
x=strlen(b1)-1;
y=strlen(b2)-1;
for(i=0,j=x;j>=0;i++,j--)//放进数组
{
a1[i]=b1[j]-'0';
}
for(i=0,j=y;j>=0;i++,j--)//放进数组
{
a2[i]=b2[j]-'0';
}
for(i=0;i<210;i++)//加法
{
a3[i]+=a1[i]+a2[i];
//printf("**%d**\n",a3[i]);
if(a3[i]>=10)
{
a3[i]=a3[i]-10;
a3[i+1]=a3[i+1]+1;
}
}
int mark;
for(i=209;i>=0;i--)
{
if(a3[i]!=0)
{
mark=i;
break;
}
}
for(i=mark;i>=0;i--)//输出
{
printf("%d",a3[i]);
}
printf("\n");
}
return 0;
}
流程:
一、接收字符串
注意点:
1、题目要求是两百位以内的正整数,说明最大是两百位,不能用int、long来做,因为超出了int和long所能表示的范围。
2、接收数字时只能用字符串接收,无法用长数组来接收,因为数组会把一长串数字全放在一个位置,不能一个数字一个数字拆开存放,一个位置又放不下两百位的数。
3、字符串的长度应为数字最大长度+1,即200+1,因为字符串的存放会在末尾自动加上\0,表示字符串的结束,这个\0会占用一个位置。正因此,sizeof(“hello”)的值会是6。but区分strlen(),它是不计入\0的,strlen(”hello“)=5。
4、此外,还get到为啥vs里面用是scanf接收字符串时一直失败呢?因为……忘了,解决的方法是在#include前面加上一样什么东西的来着(一查便知)。
二、将字符串存进数组里
注意点:
1、经验证,第一个输入的数字会放在字符串中下标为0的地方,而数字的输入顺序是先输入最高位,最后输入个位,所以按照数字的排列(输入)顺序,数组是0、1、2、……这样排列的,下标越靠近0,位数越大。例如123,下标0是百位,下标1是十位,下标3是个位。但是,数组不应当这样放,而是应当倒过来——个位放在下标0,十位放在下标1,位数越大,下标越大。因为不这样放的话,假如最高位有进位,按照最高位下标是0的规则,那最高位的进位的下标是否就成了-1呢?即使一开始预留了进位的下标,也没有一开始就倒过来方便。
2、输入的数字最大是两百位,那输出的数字最大也是两百位吗?错!还得考虑最高位进位问题!所以,存放结果的数组的大小不应当是200,而是201,这是个坑!综合第一点中的3,干脆就把所有的大小都不要设在200或201了,都离200稍微远一点,比如210,就万事大吉了。
三、加法
注意点:
1、加法唯一要注意的就是进位问题。处理起来也挺简单:如果要进位,那么先当前位-10,然后当前位的高位+1。不过注意:既然高位加了1,那么最高位的结果除了原来的结果,还得加上它自己(即自加),因为刚刚高位+1表示有进位了呀。
四、去零
注意点:
1、一开始很疑惑为什么要给数组赋初值为0呢?直到看到运行结果的正确结果前面有一堆乱码的时候知道了为什么。这有可能是因为把字符串中的‘\0’也给赋值到了数组中去。顺便一提:字符串如果没有输满的话,空的那些格里放的都是\0。此时sizeof的值会把所有的\0全都算进去,就成了字符串的长度:201.
五、输出
注意点:
1、要从高位往地位找到第一个非零的数字,从这个数字开始往低位输出。找法很简单:设置一个int型变量,它的值就是第一个非零的下标。输出时用for循环,就从这个下标开始。
参考文章:
C语言大整数加法