剛好今天的電腦很給面子啊!
所以今天大概只能把這一篇打完囉~~
這次的題目是 UVa 10922 : 2 the 9s
題目原文 :
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=21&page=show_problem&problem=1863
這個題目乍看之下好像出現了很多 9 ,看起來很機車( 誤 ),其實還滿簡單的
大家應該都知道一個數如果是 9 的倍數的話,那麼它每個位數相加的結果也應該要是 9 的倍數才對,那麼,相加後的數字的位數相加的結果也是 9 的倍數呢? ( 好吧,這邊有一點拗口,我的表達能力有問題啊! QQ )
而這個題目就是會給你一些數字,問你這些數字能夠重複執行幾次動作( 題目中稱為 degree )直到不為 9 的倍數或者是 9
我在這裡舉個例子好了 :
假設現在有一個數字 999999999 ( 9 個 9 ),那個它的每個位數相加的結果就是 81 ,如果 81 是 9 的倍數( 顯然是的 ),那就表示我們做了這個動作一次,接著,再看看 81 的每個位數相加的結果,出來的是 9 ,那就表示我們又做了這個動作一次,最後,變成 9 以後,次數就再加一,因此 999999999 的 degree 就是 3
不過,如果最後加出來的數字並非 9 的倍數,結束時 degree 就不用加一,如果剛好是 9 的話,就加一
而如果這個數一開始相加的時候就不是 9 的倍數的話,就輸出 " 數字 is not a multiple of 9."
解題想法 :
首先,我們不可能直接用 int 型態直接存題目要給我們的數字,一定會爆掉,所以要用 string 或字元陣列存取接下來就是先將位數和存起來啦~我這邊是用 Count 存起來,接下來將 degree 設成 0 ,接著就是重頭戲囉
在迴圈中,首先要看看這個 Count 是不是 9 的倍數,如果不是就直接結束,而如果 Count 剛好是 9 的話,degree 就加一然後結束
而下面的迴圈部分就是將 Count 的位數和存回 Count 中,再繼續執行迴圈查看 Count 是否還為 9 的倍數
最後,就依照 degree 的數量來決定如何輸出,如果是 0 的話,就表示這個數字原本就不是 9 的倍數了,否則就輸出它的 degree 有多少
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
string input;
while (cin >> input && input != "0")
{
int degree = 0,Count = 0;
for (int i=0;i<input.length();i++)
Count += ( input[i] - '0' );
while ( 1 )
{
if ( Count % 9 )
break;
else if ( Count == 9 )
{
degree ++;
break;
}
int temp = 0;
while ( Count )
{
temp += ( Count % 10 );
Count /= 10;
}
Count = temp;
degree ++;
}
if ( degree )
printf("%s is a multiple of 9 and has 9-degree %d.\n",input.c_str(),degree);
else
cout << input << " is not a multiple of 9.\n";
}
return 0;
}
後記 :
雖然這個題目很簡單,可是我發現它好難解釋阿 ( 跪 )話說回來,我剛剛無聊去 google 搜了一下我之前寫的文章的標題,結果我翻了 4 、 5 頁都找不到我的部落格ㄟ,我好難過歐 QQ
看來我要開始寫一個按鍵精靈來刷我的瀏覽次數惹 ( 誤 ),雖然我不會寫按鍵精靈啦 XDD
解釋的很用心!希望你繼續加油 我是目前剛就讀資工的學生 看完之後覺得這題變簡單了
回覆刪除