數列求和 加強版 C語言

2021-10-02 16:52:48 字數 1539 閱讀 2420

題目詳情

給定某數字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。

要求時間限制: 200 ms

記憶體限制: 64 mb

**長度限制: 16 kb

輸入格式:

輸入數字a與非負整數n。

輸出格式:

輸出其n項數列之和s的值

輸入樣例:

1 3輸出樣例:

123個人思路

這道題的侷限是當輸出其n項之和s的值時發現s太大了

拿最大的來說:當a=9,n=100000時,

s肯定是》最後一項999…9(總共有10^5個9)>9.0e+99999

int(最大為2^31 - 1 = (1<<31)-1 )還是long long(最大為2^63 - 1 = (1<<63)-1 )還是long double(最大為1.1e+4932)都不可以滿足大於9.0e+99999

所以我打算採用豎式加法計算,這樣可以把很大的乙個s這樣的數分成各個位數的值來儲存,可以用乙個陣列記錄各個位數的數值,而十進位制中各個位數上的值又不可能超過10,所以避免了越界問題。可以先從低位到高位如此分位計算和分別考慮前一位的進製問題,然後再用陣列元素來記錄下各個位數上的數值

不用動態鍊錶或者可變陣列的話需要考慮一開始定義陣列的大小,而決定陣列大小的又是當其n項數列之和s的值的最大值(也就是當a=9,n=100000時),此時的最大的數s是可以估算出來的,可以用下面方法:

#include

//int在正數的範圍是1~2147483647

intmain

(int argc,

char

const

*ar**)

;//記錄結果的各個位數,通過計算當a=9,n=100000時,最多為100001個位數

scanf

("%d %d"

,&a,

&n);

int jinwei=

0,num=n,weishu=0;

//num來輔助各個位數的計算 , weishu用來判斷輸出時的有效最高位

//接下來進行豎式加法計算

for(

int i=

0; i1;i++

)//i=0表示從個位開始相加 ,且最多到n+1位(i的值最多為n)

for(

int i=n; i>=

0;i--

)//用來判斷輸出時的有效最高位(篩選作用)

}for

(int i=weishu; i>=

0;i--

)//從有效的最高位開始逐個輸出

return0;

}

數列求和 加強版 PAT

原題如下 給定某數字a a 1 le a le 91 a 9 以及非負整數n n 0 le n le 1000000 n 10 0000 求數列之和s a aa aaa cdots aa cdots as a aa aaa a a a n n個aa 例如a 1a 1,n 3n 3時,s 1 11 1...

7 38 數列求和 加強版

給定某數字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 3123最近這些天一直在玩,沒怎麼寫 看到這題直覺就是像以前一樣開闢字元陣列,昨...

7 38 數列求和 加強版

給定某數字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的值。如果這道題按數學中的四則運算去直接計算結果,該資料會超出long long 的範圍,...