Chinaunix首页 | 论坛 | 博客
  • 博客访问: 657759
  • 博文数量: 45
  • 博客积分: 931
  • 博客等级: 准尉
  • 技术积分: 590
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-17 13:27
文章分类

全部博文(45)

文章存档

2013年(6)

2012年(15)

2011年(23)

2005年(1)

分类: C/C++

2011-12-11 23:34:03


Input:
每一行输入一个大整数,最多200位长度, 输入的最后一行是一个0, 表示输入的结束。
  1. 123456789012345678901234567890
  2. 123456789012345678901234567890
  3. 123456789012345678901234567890
  4. 0

Output:
输出输入的所有的数的和。
  1. 370370367037037036703703703670

下面是用字符数组实现的:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  /**

   计算两个大整数的和,输入:a和b分别使用字符串表示的两个大整数,输出:c是a和b的和

  */

  1. void sum(char *a, char *b, char *c) {
  2.    int i, j, k;
  3.    int len1 = strlen(a);
  4.    int len2 = strlen(b);
  5.    k = (len1 > len2) ? len1: len2;
  6.    memset(c, '0', k);
  7.    c[k+1] = '\0';
  8.    int carry = 0, temp;
  9.    for(i=len1-1, j=len2-1; i>=0 || j>=0; i--, j--, k--)
  10.    {
  11.       temp = carry;
  12.       if(i>=0) temp += a[i] - '0';
  13.       if(j>=0) temp += b[j] - '0';
  14.       
  15.       if (temp >= 10) {
  16.          c[k] = temp - 10 + '0';
  17.          carry = 1;
  18.       } else {
  19.          c[k] = temp + '0';
  20.          carry = 0;
  21.       }
  22.    }
  23.    c[k] = carry + '0';
  24. }

  25. int main()
  26. {
  27.    char a[200], b[200], c[200], *p;
  28.    scanf("%s",a);
  29.    while(true) {
  30.       scanf("%s", b);
  31.       if(strcmp(b, "0") == 0) break;
  32.       sum(a, b, c);
  33.       p = c;
  34.       if(*p == '0') p++;
  35.       strcpy(a, p);
  36.    }
  37.    
  38.    printf("The result is: %s \n", a);
  39.    system("pause");
  40.    return 0;
  41. }

阅读(15048) | 评论(3) | 转发(2) |
给主人留下些什么吧!~~

liubird2011-12-30 09:39:23

manchester1878: 没考虑有进位的情况.....
最后的一句:    c[k] = carry + '0'; 就是用来考虑进位的。

鱼门客栈2011-12-12 23:35:10

还是除法比较有难度

manchester18782011-12-12 01:01:43

没考虑有进位的情况