前言
今早把很早之前在九度上没有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;
}
后记
大家有其它好的方法欢迎跟帖留言,我感觉自己是很菜的,所以希望大家各种指导,都是交流没限制。