2008年12月28日星期日

05年复赛第三题 求两数相加的和

05年复赛第三题 求两数相加的和

对于任意输入的位长可达100位的两个正整数,求它们的和。

输入样例:
234,456
输出样例:
790

分析:
大数加法,使用数组模拟存储,加法计算方法使用循环模拟。
此部分由于C语言特点,使用了命令行参数,以后有待完善。

C代码:

#include < stdio.h >
#include < stdlib.h >
#include < math.h >
#include < string.h >

int main(int argc, char **argv)
{
int *a, *b, *c, m, n, p, i;
m = strlen(argv[1]);
n = strlen(argv[2]);

p = m>n ? m:n;

a = malloc(sizeof(int) * p);
b = malloc(sizeof(int) * p);
c = malloc(sizeof(int) * (p+1));
memset(a, 0, sizeof(int) * p);
memset(b, 0, sizeof(int) * p);
memset(c, 0, sizeof(int) * (p+1));

for (i = m-1; i >= 0; i--) {
a[i] = argv[1][m-1-i] - '0';
}

for (i = n-1; i >= 0; i--) {
b[i] = argv[2][n-1-i] - '0';
}

for (i = 0; i < p; i++) {
c[i] = a[i] + b[i] + c[i];
if (c[i] >= 10) {
c[i+1]++;
c[i] = c[i] % 10;
}
}

for (i = 0; i < m; i++) {
printf("%d", a[i]);
}
printf("\n");
for (i = 0; i < n; i++) {
printf("%d", b[i]);
}
printf("\n");
for (i = 0; i < p+1; i++) {
printf("%d", c[i]);
}
printf("\n");
if (c[p] == 0) {
for (i = p-1; i >= 0; i--) {
printf("%d", c[i]);
}
} else {
for (i = p; i >= 0; i--) {
printf("%d", c[i]);
}
}
printf("\n");

free(a); free(b); free(c);

return 0;
}

没有评论:

发表评论