给定某数字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
这道题有两种思路:
1.大数的求和问题:
//5-38 数列求和-加强版
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char a[10000005],b[10000005],back[10000005];
void add()
{
int i,j,k,up,x,y,z,l;
char *c;
if (strlen(a)>strlen(b)) l=strlen(a)+2; else l=strlen(b)+2;
c=(char *) malloc(l*sizeof(char));
i=strlen(a)-1;
j=strlen(b)-1;
k=0;up=0;
while(i>=0||j>=0)
{
if(i<0) x='0'; else x=a[i];
if(j<0) y='0'; else y=b[j];
z=x-'0'+y-'0';
if(up) z+=1;
if(z>9) {up=1;z%=10;} else up=0;
c[k++]=z+'0';
i--;j--;
}
if(up) c[k++]='1';
i=0;
c[k]='\0';
for(k-=1;k>=0;k--)
back[i++]=c[k];
back[i]='\0';
}
int main()
{
int A,N;
scanf("%d%d",&A,&N);
if(N==0) printf("0\n");
else
{
int f=A;
sprintf(a,"%d",0);
sprintf(b,"%d",A);
for(int i=0;i<N;i++)
{
add();
int j;
for( j=0;back[j]!='\0';j++)
a[j]=back[j];
a[j]='\0';
for(j=0;b[j]!='\0';j++);
b[j]=A+'0';b[j+1]='\0';
}
puts(back);
}
return 0;
}
这样做的结果只有16分,最后两组数据超时
法二:成功AC
#include <stdio.h>
#include <string.h>
#include <math.h>
int num[1000000];
int main()
{
int A;
int N;
int i;
int j;
int t;
int flag;
scanf("%d%d",&A,&N);
if(N == 0)
printf("0\n");
else
{
flag = 0;
for(i=N, j=0; i>=1; i--, j++)
{
t = A*i + flag;
flag = t / 10;
num[j] = t % 10;
}
if(flag > 0)
{
num[j] = flag;
j++;
}
for(i=j-1; i>=0; i--)
{
printf("%d",num[i]);
}
}
return 0;
}
思路如下:
/*
进位flag 个位
99999 9*5+0=45 4 5
9999 9*4+4=40 4 0
999 9*3+4=31 3 1
99 9*2+3=21 2 1
+ 9 9*1+2=11 1 1
flag>=1,需要前进以为为flag;
---------
*/
本文介绍了一种特殊的数列求和问题,给定数字A及非负整数N,求解形如A+AA+AAA+...+AA...A(N个A)的数列之和。提供了两种实现思路:一种基于大数处理的方法;另一种则通过数学规律优化求解,避免了大数运算带来的效率问题。

1064

被折叠的 条评论
为什么被折叠?



