-
题目描述:
-
实现一个加法器,使其能够输出a+b的值。
-
输入:
-
输入包括两个数a和b,其中a和b的位数不超过1000位。
-
输出:
-
可能有多组测试数据,对于每组数据,
输出a+b的值。
-
样例输入:
-
2 6 10000000000000000000 10000000000000000000000000000000
-
样例输出:
-
8 10000000000010000000000000000000
代码:
#include <stdio.h>
#include <string.h>
char s1[1010],s2[1010];
int main() {
int i;
for(i=0;i<1010;i++)
s1[i] = s2[i] = 0;
while(scanf("%s %s",s1,s2)!=EOF) {
int ex=0,j,k=0;
int len1 = strlen(s1);
int len2 = strlen(s2);
int result[1011];
for(i=len1-1,j=len2-1;i>=0&&j>=0;i--,j--) {
int x = s1[i] - '0';
int y = s2[j] - '0';
result[k++] = (x+y+ex)%10;
ex = (x+y+ex) / 10;
}
if(j<0&&i>=0) {
while(i>=0) {
int x = s1[i] - '0';
result[k++] = (x + ex) % 10;
ex = (x+ex) / 10;
i--;
}
}
if(i<0&&j>=0) {
while(j>=0) {
int y = s2[j] - '0';
result[k++] = (y + ex) % 10;
ex = (y + ex) / 10;
j--;
}
}
if(ex==1)
result[k++] = ex;
for(i=k-1;i>=0;i--)
printf("%d",result[i]);
printf("\n");
}
return 0;
}
1.先将每个字符数字,转换为数字再计算。
2.考虑进位
3.计算单个字符串数字时不要忘了考虑进位
4.最后两个字符串数字都计算完了之后,可能有进位,此时不要忘了加上进位。
另一种方法:
#include <stdio.h>
#include <string.h>
struct bigInteger {
int digit[1000];
int size;
void init() {
for(int i=0;i<1000;i++)
digit[i] = 0;
size = 0;
}
void set(char str[]) {
init();
int l = strlen(str);
for(int i = l - 1,j=0,t=0,c=1;i>=0;i--) {
t += (str[i] - '0') * c;
j++;
c *= 10;
if(j==4 || i==0) {
digit[size++] = t;
j = 0;
t = 0;
c = 1;
}
}
}
void output() {
for(int i=size-1;i>=0;i--) {
if(i!=size-1)
printf("%04d",digit[i]);
else
printf("%d",digit[i]);
}
printf("\n");
}
bigInteger operator + (const bigInteger &A) const {
bigInteger ret;
ret.init();
int carry = 0;
for(int i=0;i<A.size||i<size;i++) {
int tmp = A.digit[i] + digit[i] + carry;
carry = tmp / 10000;
tmp %= 10000;
ret.digit[ret.size++] = tmp;
}
if(carry != 0)
ret.digit[ret.size++] = carry;
return ret;
}
}a,b,c;
char s1[1001],s2[1001];
int main() {
while(scanf("%s %s",s1,s2)!=EOF) {
a.set(s1);
b.set(s2);
c = a + b;
c.output();
}
return 0;
}