您的位置:首页 > 其它

5-38 数列求和-加强版 (20分)

2016-05-14 19:04 323 查看
给定某数字AA(1\le
A\le 91≤A≤9)以及非负整数NN(0\le
N\le 1000000≤N≤100000),求数列之和S
= A + AA + AAA + \cdots + AA\cdots AS=A+AA+AAA+⋯+AA⋯A(NN个AA)。例如A=1A=1, N=3N=3时,S
= 1 + 11 + 111 = 123S=1+11+111=123。


输入格式:

输入数字AA与非负整数NN。


输出格式:

输出其NN项数列之和SS的值。


输入样例:

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;

---------

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: