- 題目描述:
-
給定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;??
- }??
下面有個人給出了更簡單的解法:直接模擬小學加法從個位數開始加,該進位的進位,然后存到一個棧里面,最后出棧輸出就完事了,代碼:
- #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比較大的時候,運行速度很慢。但不會溢出。