题目描述:
给定某数字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
注:以上为原题描述,版权归属:
作者:DS课程组
单位:浙江大学
我的思路:
1. N最大为10000,不可用定义整形去求和,需用数组存储和的每一位,模拟进位,然后打印数组,求得结果。
2. AA···A(N个A)可以表示为(10N - 1)A/9,则S=(A/9)*(11···10 - N),其中11···10有N个1,由于A在1~9之间,故和S的位数一定是N位或N+1位。
代码实现:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a,n;
scanf("%d%d",&a,&n);
if(n==0) //0位直接输出0
{
printf("0\n");
}
else
{
int *p;
p=(int *)malloc(sizeof(int)*(n+1));
p[n]=0; //将和S的第n+1位赋值为0,便于后面判断
int num=n;
int t=0;
for(int i=0;i<n+1;i++)//模拟加法的取余与进位
{
t=t/10+a*num;
p[i]=t%10;
num--;
}
if(p[n]==0) //第n+1位为0,从第n位打印
{
for(int i=n-1;i>=0;i--)
{
printf("%d",p[i]);
}
}
else //第n+1位不为0,从第n+1位打印
{
for(int i=n;i>=0;i--)
{
printf("%d",p[i]);
}
}
printf("\n");
free(p);
p=NULL;
}
return 0;
}