-
題目描述:
-
給定a和n,計算a+aa+aaa+a...a(n個a)的和。
-
輸入:
-
測試資料有多組,輸入a,n(1<=a<=9,1<=n<=100)。
-
輸出:
-
對於每組輸入,請輸出結果。
-
範例輸入:
-
1 10
-
範例輸出:
-
1234567900
從題中就可以看出,當a = 9, n = 100的時候,一個int類型的數是存不下100位的數,所以不能運用平常的方法來求,下面介紹我的解法,我聲明一個向量v用來儲存a+aa+aaa+a...a(n個a)的和,temp是用來儲存a...a(n個a)的,從個位向高位分別相加,hight用來儲存進位的。
#include <iostream>#include <vector>using namespace std;int main(){int a, n;int sum = 0;vector<int> v;vector<int> temp;vector<int>::iterator it;int hight = 0; //儲存進位while(cin >> a >> n){v.clear();temp.clear();v.push_back(a);temp.push_back(a);for(int i = 2; i <= n; i++){temp.push_back(a);int j = temp.size() - 1; int k = v.size() - 1;hight = 0;sum = 0;while(k >= 0 && j >= 0){ //從低位向高位相加sum = temp[j] + v[k] + hight;hight = 0;if(sum > 9){hight = sum / 10; //求進位}v[k] = sum % 10; k--;j--;}//if(hight > 0){while(j >= 0){ //可能要加的數比總的位元還要多,比如 9 + 99;sum = temp[j] + hight;hight = 0;if(sum > 9){hight = sum / 10;}v.insert(v.begin(), sum % 10);j--;}if(hight > 0){//如果還有進位,那就放到最高位v.insert(v.begin(), hight);}//}}for(it = v.begin(); it != v.end(); it++){cout << *it;}cout << endl;}return 0;}
結果:a = 9 n = 200,a+aa+aaa+a...a = 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110910
下面有個人給出了更簡單的解法:直接類比小學加法從個位元開始加,該進位的進位,然後存到一個棧裡面,最後出棧輸出就完事了,代碼:
#include <cstdio>#include <stack>using namespace std;int main(){// freopen("1.txt", "r", stdin); int a, n, i, t, c; while(~scanf("%d %d", &a, &n)) { stack<int> S; for(c=0,i=1; i<=n; i++) { t = (n-i+1)*a; S.push((t+c)%10); c = (t+c)/10; } if(c>0) S.push(c); while(!S.empty()) { printf("%d", S.top()); S.pop(); } printf("\n"); } return 0;}
但是這個有個缺點,就是當n好大,t = (n - i + 1) * a 會溢出,這個程式的有點是運行速度很快,我上面的代碼當n比較大的時候,運行速度很慢。但不會溢出。