大数加法
Total Submit:1989 Accepted:522
Description
求两个非负整数(1000位以内)的和。
Input
两个非负整数(1000位以内),以空格分隔。
Output
两个非负整数的和。
Sample Input
111111111111 222222222222
Sample Output
333333333333
Hint
Source
GUOJ
分析:C++最大_int64也不够放大数的,所以肯定是用数组来进行大数运算。一开始就卡在怎么输入上了。如果输入数据一行一个,那就可以很简单的用gets()来获取字符串。然而现在是一行用空格分隔输入2个数,这种方法也不是不行,只是繁琐一些(一股脑儿冲到底吧),用gets后,判断是否为空格,不是的话就利用getchar()一个一个将字符输入到char型数组,之后再。。。
显然。略麻烦。
当然,最简单的是:
scanf("%s %s",&s1,&s2); //抓狂中!!!
之后思路很清晰,可以将char型数组转换成int型数组,再循环加,只需注意进位即可。
不过还是有一点小窍门,因为大数小于1000位,和数组(sum数组)最大位数和两个int数组一样。PS:数组用了1000方便,其实严格的话是999。如果两个数都为999位且相加最高位要进位,例如9999...+9999...,只需判断最后一次相加要不要进位,若需进位,则单独输出一个1。这样就快捷了。
结果是,偶然的写法其实大有内涵:
由于数组相加循环最大是 数组a和数组b中下标最大的,所以所有最高位要进位的话,都是要人工输出的,即如果2个大数相同个数且最高位要进位,都会主动先输出一个1。
这个小题目基本就做完了。关于数组加法还有很多写法,关键是进位carry有很多判定。
贴上很nice的代码:^_^
#include<stdio.h>
#include<string.h>
//大数加法 1000位以内
int main()
{
char s1[1000]; char s2[1000];
int a[1000] = {0}; int b[1000] = {0}; int sum[1000] = {0}; // 第1000位 进位单独考虑
scanf("%s %s",&s1,&s2);
int lenA = strlen(s1) - 1; // 最大下标
int lenB = strlen(s2) - 1;
// 转换成 int , 逆序,a[0]为个位...
int k = 0;
for(int i=lenA;i>=0;i--)
{
a[k] = s1[i] - '0';
k++;
}
k = 0;
for(int i=lenB;i>=0;i--)
{
b[k] = s2[i] - '0';
k++;
}
int carry = 0; // 进位标志
for(int i=0;i<=(lenA>lenB ? lenA : lenB);i++) // 0~lenA与lenB中大的一个
{
int tmp1 = a[i] + b[i] +carry;
sum[i] = tmp1%10;
if(tmp1 >=10)
carry = 1;
else
carry = 0;
}
if(carry == 1) printf("1"); // 最高位进位了 单独输出1
for(int i=(lenA>lenB ? lenA : lenB);i>=0;i--)
printf("%d",sum[i]);
return 0;
}