给定某数字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>
long long Pow(int x,int y){
long long answer=1;
int i;
for(i=1;i<=y;i++){
answer=answer*x;
}
return answer;
}
long long getResult(int a,int i){
long long Result=0;
int j;
for(j=0;j<i;j++){
Result=Result+a*Pow(10,j);
}
return Result;
}
int main()
{
long long sum=0;
int i,n,a;
long long result;
scanf("%d %d",&a,&n);
for(i=1;i<=n;i++){
result=getResult(a,i);
sum+=result;
}
printf("%lld\n",sum);
return 0;
}
这题里面的数据十分的庞大,我用了long long都无法存下,同时for循环过多,导致有2个点过不去
正确代码:
#include<stdio.h>
int main()
{
int number[100009]; //使用数组来存放这个数字
int a,n,i;
int count;
int temp=0; //temp用来表示进位
scanf("%d%d",&a,&n);
count=n;
if(n==0){
printf("0");
} //当只有0时单列
else{for(i=0;i<n;i++){
number[i]=(a*count+temp)%10;
temp=(a*count+temp)/10; //进位数
count--; //位数减一
}
if(temp!=0){
printf("%d",temp); //若最后一个进位数不为0就打印,为0不打印
}
for(i=n-1;i>=0;i--){
printf("%d",number[i]); //逆序打印数字
}
printf("\n");
}
return 0;
}
注意的点就是将庞大的数字储存到数组之中去。
解题原理以9 3为例:
正常来说,得到的数字为9+99+999=1107。我们可以观察到,7=[3*9+temp(temp=0)]%10,所以number[0]=7,之后注意到[3*9+temp(temp=0)]/10=2,要向前进2位,所以temp=2。之后有0=[2*9+temp(temp=2)]%10所以number[1]=0,之后进2位,temp=2.以此类推。到最后数组number为[7,0,1]。此时temp=1,1!=0,所以将1打印。最后将数组逆序打印,打成107.这样我们就得到了1107.
:D