ACM 大数加法

来源:互联网 发布:优化蜜蜡对人的危害 编辑:程序博客网 时间:2024/05/16 07:53

大数加法

Time Limit(Common/Java):1000MS/3000MS          Memory Limit:65536KByte
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"); // 最高位进位了 单独输出1for(int i=(lenA>lenB ? lenA : lenB);i>=0;i--)printf("%d",sum[i]);return 0;}




0 0
原创粉丝点击