给定某数字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
结尾无空行
小白做的第一道数据结构的题,c语言才学到创建函数,自己摸索了快3个小时,代码测试才通过,有瑕疵的地方还请各位大佬指正。
第一次成功好激动!!!!
把数字列成竖式,就有思路了
#include <stdio.h>
#include <stdlib.h>
int main()
{
long long int a,n,i,j,k;
int m[100003]={0};//存储数字每一位
scanf("%d %d",&a,&n);
if(n==0)//当n等于0时,直接输出0
{
printf("0");
}
else if(a==9)//当n=9时,因为进位部分在打印时需要根据i来判定,n=9必要再进一位,而i的循环已经截止,所以要额外判定,再多循环一次
{
for(i=0,k=n;i<n;i++,k--)
{
m[i]+=k*a;//前一位的值需要累加
if(m[i]>9)//大于9就要进位
{
m[i+1]+=m[i]/10;//进位等于前一位除以10
m[i]=m[i]%10;//前一位只保留乘积的个位
}
else
{
m[i]=m[i]%10;//不过9就不需要进位
}
}
for(i;i>=0;i--)//i需要多循环一次
printf("%d",m[i]);
}
else
{
for(i=0,k=n;i<n;i++,k--)
{
m[i]+=k*a;
if(m[i]>9)
{
m[i+1]+=m[i]/10;
m[i]=m[i]%10;
}
else
{
m[i]=m[i]%10;
}
}
for(i--;i>=0;i--)//最高位无需进位,所以少循环一次,避免出现最高位为0的情况(例如打印出0123)
printf("%d",m[i]);
}
return 0;
}
补充一下为什么要单独列出a=9的情况:
如果a=8,则最高位=8,次高位=8*2=16,次高位进位最多只能是1,而最高位8+1=9,最高位就不需要进位了,原来的循环就足够刚好打印出了。
如果a=9,则最高位=9,次高位=9*2=18,次高位进位最多只能是1,而最高位9+1=10,最高位就需要进位了,如果按照原来的循环,那么就会少循环一次,最高位便打印不出,所以要单独判断,打印数组的循环次数就要多一次。