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