# POJ 1503 Integer Inquiry C语言版

POJ题解 3429浏览

Description

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.)

Input

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.

Output

Your program should output the sum of the VeryLongIntegers given in the input.

Sample Input

123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
0

Sample Output

370370367037037036703703703670

Slyar:说下题意。给你至多100行超大整数，以0结束输入，要求你求出这些超大整数的和。

1、以字符串格式读入超大整数，然后将每一位转换成整型并逆序存放在数组中。

2、把每次读入字符串的长度存放在0号元素中(sum[i][0])。

3、将所有大整数的和存放在0号字符串中(sum[0])。

4、从0号字符串最大处向前寻找第一个不为0的元素，然后逆序输出和。

```#include
#include
#include

#define MAX 105

char sum[MAX][MAX];
char str[MAX];

int main()
{
int i, j, he, jin, line;

for(i = 0; ;i++)
{
gets(str);
if (str[0] == '0' && str[1] == 0) break;
/* 0号元素记录长度 */
sum[i][0] = strlen(str);
/* 逆序存放大整数 */
for (j = 1; j <= sum[i][0]; j++)
{
sum[i][j] = str[sum[i][0] - j] - '0';
}
}

/* 记录数据行数 */
line = i;

/* 用第0行存放和 */
for (i = 1; i < line; i++)
{
/* 进位标记归0 */
jin = 0;
/* 进行加法运算 */
for (j = 1; j < MAX - 1; j++)
{
he = sum[0][j] + sum[i][j] + jin;
/* 进位 */
jin = he / 10;
sum[0][j] = he % 10;
}
}

/* 从后向前找到不为0的第一个数 */
for(i = MAX - 1; sum[0][i] == 0; i--);

/* 输出和 */
for (; i >= 1; i--)
{
printf("%d", sum[0][i]);
}
printf("\n");

//system("pause");
return 0;
}
```

### 网友最新评论 (6)

1. if (str[0] == '0' && str[1] == 0) break; 这一句中，str[1] == 0是干什么用的？
shilong10年前 (2011-08-23)回复
2. 对位就是使被加数和加数有相同的位数；补零，由于两个正数相加可能有进位，对位后再在它们前面各补一个0以确定和的最大位数。@Cnfn
匿名10年前 (2011-01-02)回复
3. 请问你使用的是哪个代码插件？ 感觉你使用的这个插件显示效果比较好，期待回复！
Cnfn10年前 (2010-12-29)回复
4. @匿名 对位补0?什么意思？
Cnfn10年前 (2010-12-29)回复
5. 高精度加法基本方法：清除前导0，对位补0，相加，再清除前导0，就很简单。
匿名10年前 (2010-10-26)回复
6. 前辈你好，看过你的这篇文章，写的很通俗明了。 我的代码一直交不上，想请你帮忙看一下，找一下错误，谢谢，请发到我邮箱wenan2007@126.com 以下是我的程序代码： #include #include void main() { char str[3]="0",str1[150],str2[100];int m,n,i,max,sum1,sum2; gets(str1); if(strcmp(str,str1)) {gets(str2); while(strcmp(str,str2)) { m=strlen(str1);n=strlen(str2);max=m; if(m>n) { for(i=1;i=0;i--)str2[i]='0'; } if(m<n) { max=n; for(i=1;i=0;i--)str1[i]='0'; }//以上两个if使得字符串长度短的在字符串前补0使得字符串长度相同 sum1=str1[max-1]+str2[max-1]-'0'-'0'; str1[max-1]='0'+sum1%10; for(i=max-2;i>=0;i--) { sum2=str1[i]+str2[i]-'0'-'0'+sum1/10; str1[i]='0'+sum2%10; sum1=sum2; }//算出各个位数的数字，并将结果保存在字符串str1中 if(sum1>9) { for(i=max;i>0;i--) str1[i]=str1[i-1]; str1[0]='0'+sum1/10;max++; }//若最高位上和为两位数，则将str1的各个字符向后移动，然后对最高位赋值，由于是两个数字相加，最多使得位数加1 str1[max]=''; gets(str2); }} for(i=0;str1[i]=='0';i++);//找出字符串中首非0字符的下标 puts(&str1[i]); }
匿名11年前 (2010-06-22)回复