给定某数字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
分析:
-
初始化一个长度为100000的数组
num
,所有元素都设为0,除了num[0]
设为1。这是因为我们最后要打印的结果可能非常大,需要用到这个数组来存储每一位数字。 -
输入两个整数 a 和 n。
-
如果 n 是0,那么直接输出 "0" 并结束程序。
-
否则,从高位到低位开始计算 a 的 n 次方的每一位数字:
- 初始化变量
k
为0,用来存储进位。 - 从高位开始,用变量
i
迭代从 n 到 1,用j
迭代从 0 到 n-1。每次迭代中:- 计算
temp = a * i + k
,其中temp
是当前位的值。 - 将
temp
的个位数赋值给num[j]
,即num[j] = temp % 10
。 - 将
temp
的十位数(即进位)赋值给k
,即k = temp / 10
。
- 计算
- 初始化变量
-
如果最后的
k
不为0,那么说明还有进位,将其赋值给num[j]
并增加j
。 -
从低位到高位遍历
num
数组,并输出每个数字。由于数组是从高位到低位填充的,所以从低位开始输出就是从高位开始输出。 -
程序结束。
代码:
#include<stdio.h>
int main()
{
int num[100000]={0},a,n,i,j,k=0,temp;
num[0]=1;
k=0;
scanf("%d %d",&a,&n);
if(n==0)
{
printf("0\n");
return 0;
}
for(i=n,j=0;i>=1;i--,j++)
{
temp=a*i+k;
num[j]=temp%10;
k=temp/10;
}
if(k!=0) num[j++]=k;
for(j=j-1;j>=0;j--)
{
printf("%d",num[j]);
}
return 0;
}
总结:
这个程序使用的是竖式乘法的思路,从高位到低位依次计算每一位的值,然后再从低位到高位输出结果。