数字阶梯求和

前言

今早把很早之前在九度上没有ac的一道题目做出来了,主要是大数据求和的问题,简单的int型已经无法表示最终的结果,因为int的范围在32bit机器上是[0-4294967295],感觉是很大,但是数字阶梯求和的时候很容易就越界了。这里提供自己的一种思路。

题目描述:

给定a和n,计算a+aa+aaa+a...a(n个a)的和。

输入:

测试数据有多组,输入a,n(1<=a<=9,1<=n<=100)。

输出:

对于每组输入,请输出结果。

样例输入:

1 10

样例输出:

1234567900


解题思路

1.大数据求和时,当已知的数据类型包括int,longint无法表示的时候,可以考虑用数组来存储。
2.可以把数组理解成一个栈,将结果的个位,十位,百位等通过计算依次入栈,然后显示结果时再从高位依次出栈表示即可。
3.数字阶梯求和时,假设s[i]代表第i位上的数字,则s[i] = ((n - i) * a + carry) % 10. carry代表从低位向高位的进位数,carry = ((n - i) * a + carry) / 10.初始的carry为0
4.考虑特殊情况,例如 0 10这种阶梯求和,需要控制输出,输出应该为0,而不是0000000000

AC代码

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

int main()
{
	int a, n, plus, i, temp, count;
	int number[1000];

	while(scanf("%d %d", &a, &n) != EOF)
	{
		//数值计算
		for(i = 0, temp = 0, count = 0; i <= n; i ++)
		{
			number[i] = ((n - i) * a + temp) % 10;
			temp = ((n - i) * a + temp) / 10;
			if(number[i] == 0)
			{
				count ++;
			}
		}
		
		//打印输出
		if(count == n + 1)
		{
			printf("0\n");
		}else
		{
			for(i = n; i >=0; i --)
			{
				if(i == n && number[i] == 0)
				{
					continue;
				}else
				{
					printf("%d",number[i]);
				}
			}
			printf("\n");
		}
	}

	return 0;
}

后记

大家有其它好的方法欢迎跟帖留言,我感觉自己是很菜的,所以希望大家各种指导,都是交流没限制。

你可能感兴趣的:(数字阶梯求和)