1. 程式人生 > >PAT-基礎程式設計題-5-38 數列求和-加強版

PAT-基礎程式設計題-5-38 數列求和-加強版

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

給定某數字AAA1≤A≤91\le A\le 91A9)以及非負整數NNN0≤N≤1000000\le N\le 1000000N100000),求數列之和S=A+AA+AAA+⋯+AA⋯AS = A + AA + AAA + \cdots + AA\cdots AS=A+AA+AAA++AAANNNAAA)。例如A=1A=1A=1,N=3N=3N=3時,S=1+11+111=123S = 1 + 11 + 111 = 123S=1+11+111=123

輸入格式:

輸入數字AAA與非負整數NNN

輸出格式:

輸出其NNN項數列之和SSS的值。

輸入樣例:

1 3

輸出樣例:

123

解答程式:

方法一:(原創)

#include<stdio.h>

#define  fun x*A
int main(void)
{
        int i,x,N,b,A,j;
        scanf("%d %d",&A,&N);//N代表多少個數字,A代表數字;
        int num[1000001]={0}; //不要問我為什麼不用可變陣列:int num[N+1],也不要問我為什麼要用100萬的陣列;
                              //不用可變陣列的原因是:線上測試的編譯器跟我使用DEV C++不同,無法編譯;100萬的陣列是因為,沒有這麼長會一直顯示段錯誤;
        int flag; //只是為了方便顯示  x*A,
        i=0;
        if(N==0)    {
            printf("0\n");   
            return 0;
        }
        
            for(x=N;x>=1;x--)    {
                b=i;
                flag=fun;
                while(flag!=0)    {
                    num[i]=flag%10+num[i]; //加上後面數字的進位值,num[i]開始初始化為0
                    if(num[i]>=10)    {        //    判斷是否有進位
                        num[i]=num[i]%10;
                        num[i+1]+=1;
                    }
                    flag=flag/10;
                    i++;   //陣列下標值加1;
                    if(flag==0)    {
                        i=b; //b的作用是為了記錄flag迴圈時i的值,出去的時候再返回;
                    }
                }
            
                i++;
            }
            
        i=1000000;
        while(num[i]==0)    {  //如果陣列過長,就要先把陣列下標值移動到不為0的位置,最後輸出;
            i--;
        }
            
        for(j=i;j>=0;j--)    {
            printf("%d",num[j]);
        }
        printf("\n");    
    return 0;            

}

方法二:(非原創,有改進)

<code class="hljs perl has-numbering"><span class="hljs-keyword">int</span> main() 
{ 
 <span class="hljs-keyword">int</span> A; 
 <span class="hljs-keyword">int</span> N;
 <span class="hljs-keyword">int</span> i; 
 <span class="hljs-keyword">int</span> j; 
 <span class="hljs-keyword">int</span> t; 
 <span class="hljs-keyword">int</span> flag; 
 <span class="hljs-keyword">int</span> num[<span class="hljs-number">1000000</span>]; 
 scanf(<span class="hljs-string">"<span class="hljs-variable">%d</span><span class="hljs-variable">%d</span>"</span>,&A,&N); 
 <span class="hljs-keyword">if</span>(N == <span class="hljs-number">0</span>) 
 <span class="hljs-keyword">printf</span>(<span class="hljs-string">"0\n"</span>); 
 <span class="hljs-keyword">else</span> 
 { 
      flag = <span class="hljs-number">0</span>; 
      <span class="hljs-keyword">for</span>(i=N, j=<span class="hljs-number">0</span>; i>=<span class="hljs-number">1</span>; i--, j++) 
       { 

            t = A<span class="hljs-variable">*i</span> + flag; //flag為進位標誌

            </code><pre name="code" class="prettyprint"><code class="hljs perl has-numbering">            num[j] = t % <span class="hljs-number">10</span>; //每一次只儲存一位數字</code>

<code class="hljs perl has-numbering">            flag = t / <span class="hljs-number">10</span>; </code>
} if(flag > 0) //在N,A都大的時候,最後一位可能會有進位,所以要注意: { num[j] = flag; j++; } for(i=j-1; i>=0; i--) { printf("%d",num[i]); } } return 0; }