[C_MM062-易] 計算數字相乘後末尾0的數量
問題描述 :
讓使用者輸入一些數字後,算出這些數的乘積,最後找出這個積的最後有多少個0。
輸入說明 :
Input檔案可輸入多筆數字,每行一筆。注意:這些數字相乘的結果可能超過integer型別可容納的範圍。
輸出說明 :
Output輸出「M」,其中M代表0的次數。
範例 :
讓使用者輸入一些數字後,算出這些數的乘積,最後找出這個積的最後有多少個0。
輸入說明 :
Input檔案可輸入多筆數字,每行一筆。注意:這些數字相乘的結果可能超過integer型別可容納的範圍。
輸出說明 :
Output輸出「M」,其中M代表0的次數。
範例 :
Sample Input: | Sample Output: |
126 250 | 2 |
129 60 25 36 | 3 |
解釋:
假設數字num是31500,位數n有5位
我們要從尾巴開始數零的次數
0 -- floor(31500%(10^1)) / 10^0 -- i=0
0 -- floor(31500%(10^2)) / 10^1 -- i=1
5 -- floor(31500%(10^3)) / 10^2 -- i=2
1 -- floor(31500%(10^4)) / 10^3 -- i=3
3 -- floor(31500 / (10^4)) -- i=4
接著找出規律,把上面五行的算是變成迴圈
0 -- floor(num%(10^i+1)) / 10^i -- i=0
0 -- floor(num%(10^i+1)) / 10^i -- i=1
5 -- floor(num%(10^i+1)) / 10^i -- i=2
1 -- floor(num%(10^i+1)) / 10^i -- i=3
3 -- floor(num / (10^i+1)) -- i=4
- #include <iostream>
- #include <sstream>
- #include <cmath>
- #include <stdio.h> /* printf, fgets */
- #include <stdlib.h> /* atoi */
- using namespace std;
- int main() {
- // [C_MM062-易] 計算數字相乘後末尾0的數量
- stringstream ss;
- long long int num, mul=1, zero=0;
- //相乘的數字,相乘的結果,零的數量
- bool not_zero = true; //只算尾巴的零,所以遇到非零就停止計算
- while(cin >> num) //當輸入相乘的數字,就把它乘起來,放入mul
- {
- mul = mul * num;
- }
- //為了要計算有幾位,所以把mul從int轉string
- ss << mul; //把int型態變數寫入到stringstream
- string re_str; //相乘結果:str
- ss >> re_str; //透過串流運算子寫到string類別即可
- int count = re_str.size(); //相乘結果的長度:int
- double base = 10; //因為pow()需要double型態
- for(double i = 0;i < count;i++) //mul多長,就要執行幾次
- {
- if(i != count-1)
- {
- if(not_zero == true)
- {
- if(floor(mul % (int)(pow(base,i+1)) / (pow(10,i))) == 0)
- {
- zero++;
- }
- else
- {
- not_zero = false;
- break;
- }
- }
- }
- else
- {
- if(not_zero == true)
- {
- if(floor(mul / (int)pow(base,i)) == 0)
- {
- zero++;
- }
- else
- {
- not_zero = false;
- break;
- }
- }
- }
- }
- cout << zero << endl;
- not_zero = true;
- zero = 0;
- mul = 1;
- return 0;
- }
沒有留言:
張貼留言