5-38 數列求和-加強版 (20分)


給定某數字AA1\le A\le 91A9)以及非負整數NN0\le N\le 1000000N100000),求數列之和S = A + AA + AAA + \cdots + AA\cdots AS=A+AA+AAA++AAANNAA)。例如A=1A=1N=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  
 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; 
---------
 
*/



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com