POJ 1503 Integer Inquiry

题目描述:

输入一组以0结尾的超级大数,输出这些超级大数相加的结果。

思路:

题目较为简单,但是如果直接利用数值类型存储组内数据是行不通的,因此利用字符串存储输入数据,计算结果以字符串输出。

#include <cstdio>
#include <cstring>

/*
 * 库函数strrev在本地编译可以通过,但是在OJ编译错误
 * 所以还得自己重新编写字符串翻转函数
 */
void strlrev(char *s)
{
	char c;
	int len = strlen(s);
	for(int i = 0; i < len / 2; i++)
	{
		c = s[i];
		s[i] = s[len - i - 1];
		s[len - i - 1] = c;
	}
}

/* 
 * 字符串实现两大数相加
 * 结果存储在字符串a中,字符串a初始全为0
 * 计算结束,将字符串a翻转即为两数的和
 */
void add(char *a, char *b)
{
	strlrev(b);
	int la = strlen(a);
	int lb = strlen(b);
	int i = 0, j = 0, k = 0, s = 0, inc = 0;
	while(i < la && j < la)
	{
		s = (a[i] & 0XF) + (b[j] & 0XF) + inc;
		a[k++] = (s % 10) + '0';
		inc = s / 10;
		i++; j++;
	}
	while(i < la)
	{
		s = (a[i] & 0XF) + inc;
		a[k++] = (s % 10) + '0';
		inc = s / 10;
		i++;
	}
	while(j < lb)
	{
		s = (b[j] & 0XF) + inc;
		a[k++] = (s % 10) + '0';
		inc = s / 10;
		j++;
	}
	if(inc != 0)
		a[k++] = inc + '0';
}

int main()
{
	char a[150], b[150];
	memset(a, 0, sizeof(a)); //初始化字符串a为全零
	
	while(scanf("%s", b) && strcmp(b, "0") != 0)
	{
		add(a, b);
		memset(b, 0, sizeof(b)); //每次计算后要将字符串reset
	}
	strlrev(a);
	printf("%s\n", a);

	return 0;
}


你可能感兴趣的:(POJ 1503 Integer Inquiry)