给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。
输入格式:
输入数字A与非负整数N。
输出格式:
输出其N项数列之和S的值。
输入样例:
1 3
输出样例:
123
我的代码:
#include <stdio.h>
#define max 100000+1 //还有一个规律,任意一个四位数+任意一个三位数+任意一个两位数+任意一个一位数,结果要么是四位数,要么是五位数。
// 所以一个最大为100000位的数相加,最终结果最大为100000+1 位
// 整型范围——最大位数为100000(十万)位。
//而超过100000位的数无法输出,所以用数组来代表几位,[0]即是个位,[1]就是十位,以此类推
int main()
{
int a,n;
scanf("%d %d",&a,&n);
int number[max]={}; //初始化数组为0
if(n==0){
printf("0"); //如果要求输入0位数,那只能是0
return 0;
}
//举例:四位数+三位数+两位数+一位数,最多为五位数
// 1 9
// 11 99
// 111 + 999
//+ 1111 -------
//------ 1107 --->27(3*9)+180(2*9)+900(1*9)=1107
// 1234 对照着竖式计算的进位可知。这里27可看做在个位 18可看做18个10,在10位 9也就是在百位
// 还没有进位的基础数据
// result[3]=1*1
// result[2]=1*2; 9*1 [2]对应百位
// result[1]=1*3; 9*2 [1]对应十位
// result[0]=1*4; 9*3 其实这个[0]也就对应个位,
for(int i=0;i<n;i++){
number[i]=a*(n-i); //这里不用n--,是因为n下面还要参与运算,值不能变
} //根据上述分析,遍历,填数组当中对应值
for(int i=0;i<n;i++){
if(number[i]>=10){
//进位计算
number[i+1]=number[i+1]+number[i]/10;
//保留当前位的个位数
number[i]=number[i]%10;
}
}
int len=n+1; //定义输出的和的长度,因为最大n位的数相加,最终和是n+1或n位,所以假定长度为n+1位
if(number[n]==0){ //由于最大n位数相加,也是有可能最终和为n位,而对应的下标是[n-1]有数,[n]则还是初始化的0;
len=n; } //比如输出a=1,n=3;那么1+11+111=123,1在number[2]的位置,也就是说[3]=0,千位没有数
//那么len=3,下面for循环中,j=len-1=3-1=2,也就会从下标2,把百位的数输出。
//如果a=9,n=3;那么9+99+999=1107;1在number[3]的位置,虽然n为3,但是千位有数,则跳过if语句
//j=len-1=4-1=3, 要把千位的数输出。
for(int j=len-1;j>=0;j--){
printf("%d",number[j]);
}
return 0;
}