7-38 数列求和-加强版
给定某数字
输入格式
输入数字
输出格式
输出其
输入样例
1 3
输出样例
123
分析与答案
非负整数i+1
位(数组下标从0开始)必定是(n-i)*a
。如果先按照这个规律对每一位进行运算和进位,复杂度就可以降到
最终结果的位数也可以进行估算:数字n+1
位大的动态数组即可完整地储存结果(最终结果可能是n
位的也可能是n+1
位的)。
当然了,如果输入的
整个程序的思路如下:
- 读取输入的
a
和n
,分别对应题目的 和 ; - 如果
n==0
,直接输出0,结束程序; - 建立
n+1
位的动态数组,采用calloc
函数可以同时完成地址分配和初始化; - 开始对每一位进行操作,先加上第
i+1
位对应的a*(n-i)
,之所以是加而不是赋值,是因为此时处理的位置可能已经包含前一位进位带来的数值,即便前一位没有进位,calloc
已经完成了初始化,使用加操作也不会带来混乱。 - 如果加上后该位数字已经超过9(
>=10
),那就要进行进位操作。 - 完成循环后,局部变量
i
位于结果从右往左数的第n+1
位,如果此时这一位为0,说明结果只有n
位,把i
往前移,如果不为0则结果有n+1
位,保留不动。 - 从
i
的位置开始向前循环输出,直到第一个元素为止。
int main(){
int a = 0,n = 0;
int i = 0,j = 0;
scanf("%d %d",&a,&n);
if(n==0){
printf("0");
return 0;
}
int *res = (int*)calloc(n+1,sizeof(int));
for(i=0;i<n;i++){
//对于第(i+1)位,a被加了(n-i)次
*(res+i)+=a*(n-i);
if(*(res+i)>=10){
*(res+(i+1))=*(res+i)/10;
*(res+i)=*(res+i)%10;
}
}
if(*(res+n)==0){
i=n-1;
}
else
i=n;
for(;i>=0;i--)
printf("%d",*(res+i));
return 0;
}