首页 > 其他 > 详细

【大数加法】POJ-1503

时间:2015-03-25 22:53:49      阅读:273      评论:0      收藏:0      [点我收藏+]

1503:Integer Inquiry

总时间限制: 
1000ms
 
内存限制: 
65536kB
描述
One of the first users of BIT‘s new supercomputer was Chip Diller. He extended his exploration of powers of 3 to go from 0 to 333 and he explored taking various sums of those numbers. 
``This supercomputer is great,‘‘ remarked Chip. ``I only wish Timothy were here to see these results.‘‘ (Chip moved to a new apartment, once one became available on the third floor of the Lemon Sky apartments on Third Street.) 
输入
The input will consist of at most 100 lines of text, each of which contains a single VeryLongInteger. Each VeryLongInteger will be 100 or fewer characters in length, and will only contain digits (no VeryLongInteger will be negative). 

The final input line will contain a single zero on a line by itself. 
输出
Your program should output the sum of the VeryLongIntegers given in the input.
样例输入
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
0
样例输出
370370367037037036703703703670
  • 先说说为啥要用算法实现大数加法:

    我们来看看数据:

    bool型为布尔型,占1个字节,取值0或1。

    BOOL型为int型,一般认为占4个字节,取值TRUE/FALSE/ERROR。

    sbyte型为有符号8位整数,占1个字节,取值范围在128~127之间。

    bytet型为无符号16位整数,占2个字节,取值范围在0~255之间。

    short型为有符号16位整数,占2个字节,取值范围在-32,768~32,767之间。

    ushort型为无符号16位整数,占2个字节,取值范围在0~65,535之间。

    int型为有符号32位整数,占4个字节,取值范围在-2,147,483,648~2,147,483,647之间。

    uint型为无符号32位整数,占4个字节,取值范围在0~4,294,967,295之间。

    long型为64位有符号整数,占8个字节,取值范围在9,223,372,036,854,775,808~9,223,372,036,854,775,807之间。

    ulong型为64位无符号整数,占8个字节,取值范围在0~18,446,744,073,709,551,615之间。

    float型为32位单精度实数,占4个字节,取值范围3.4E+10的负38次方~3.4E+10的38次方之间。

    double型为64位实数,占8个字节,取值范围1.7E+10的负308次方~1.7E+10的正308次方。

 1 void Add(char a[],char b[]){
 2     int i,j,len1,len2,max;
 3     len1 = strlen(a);
 4     len2 = strlen(b);
 5     //获得最长数组的长度
 6     //两数相加最多不会超过最大数的位数+1,减少循环次数
 7     max = len1 > len2 ? len1 : len2;
 8     //将两字符串数组转换为数字数组
 9     for(i = len1 - 1,j = 0;i >= 0;i--){
10         num1[j++] = a[i] - 0;
11     }
12     for(i = len2 - 1,j = 0;i >= 0;i--){
13         num2[j++] = b[i] - 0;
14     }
15     //模拟进位运算
16     for(i = 0;i <= max;i++){
17         num1[i] += num2[i];
18         if(num1[i] > 9){
19             num1[i] -= 10;
20             num1[i + 1] ++;
21         }
22     }
23     //排除两数和为0的情况
24     for(i = 0; num1[i] == 0 && i < max+1; i++)  
25     {  
26         if(i == max+1)
27         {  
28             printf("0\n");  
29         }  
30     }  
31     for( ; i < max+1; i++)  
32     {  
33         printf("%d",num1[i]);  
34     }  
35 }
  • 感觉学会了,于是乎,就找了题,继续练练手,就是POJ-1503.
  • 然后就陷入了深坑中,首先就是那个输入,竟然一直想要用二维数组,真是。。。只能怪练得还太少。
  • 解题过程中,脑中想的方法过于复杂,那肯定就是错误的,一定要跳出这个思维,想别的思路解决。
 1 //POJ-1503-1
 2 #include <cstdio>  
 3 #include <cstring>  
 4 const int MAXN = 200;  
 5 int main()  
 6 {  
 7     char s[MAXN]; 
 8     int i, j;
 9     int m;
10     scanf("%d",&m);
11     while(m--){
12         int sum[MAXN] = {0}; 
13         while(gets(s))  
14         {  
15             int len = strlen(s);  
16             if(s[0] == 0 && len == 1)  
17                 break;  
18             //sum[]保存所有组的各位的和
19             for(i = 110, j = len-1; j >= 0; i--, j--)  
20             {  
21                 sum[i] += s[j]-0;  
22             }  
23         }  
24         //将sum[]每个元素,进行进位
25         for(i = 110; i > 0; i--)  
26         {  
27             sum[i-1] += sum[i] / 10;  
28             sum[i] %= 10;  
29         }  
30         //排除和为0的情况
31         for(i = 0; sum[i] == 0 && i < 111; i++)  
32         {  
33             if(i == 111)//意味着全为零  
34             {  
35                 printf("0\n");  
36             }  
37         }  
38         for( ; i < 111; i++)  
39         {  
40             printf("%d",sum[i]);  
41         }  
42         printf("\n\n"); 
43     }     
44     return 0;  
45 }
  • 减法、乘法、除法明天继续

 

【大数加法】POJ-1503

原文:http://www.cnblogs.com/zhengbin/p/4366963.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!