問題描述:
乙個正整數的數根可以這樣求得:計算該整數的各位數之和,如果結果值是單個數字,如果結果值是單個數字的和,那麼這個數就是所求數根;如果結果值是由兩位或兩位以上的數字組成的數,則繼續計算各位的數字的和,直到結果值只有一位數字為止。
例如:正整數24, 2+4=6,則6是24的樹根 又如39, 3+9=12,12不是單個數字,故繼續計算 1+2=3 。 故39的根為3.
輸入:輸入包括多組測試資料,每組測試資料報括乙個正整數,並且佔一行,輸入資料位0時表示輸入結束。
輸出:對於每組測試資料,給出對應的輸出,並且每組佔一行。
輸入樣例:
輸出樣例
這是我在《c程式設計競賽實訓教程》中看到的乙個很基礎的題目。
之所以寫部落格記錄下它,主要是為了開個頭,並且介紹下acm中輸入輸出資料格式問題,並且演算法的一些思路。
下面來整理下我接觸到這題目的想法,可能有點傻...
首先,問題並不難,要做的有這麼幾點
①正確分組測試,考慮輸入結束條件的判斷。
②先求所給陣列各位數相加的和。
③判斷這個相加的和是否是個位數,如果不是,執行第二步,否則就是我們想要的數根。
思路很清晰,問題很簡單,上述三步就能解決問題了。
下面逐一分析。
在acm中,往往要求輸入一組或者多組資料,這就要求我們不能輸入或者輸入無關的語句,嚴格按照要求去做。
就本題多組資料的輸入,有如下的框架
scanf("%ld",&num_1);
while (num_1 != 0)
while ( 1 )
//資料處理語句
//輸出結果
}
for (;scanf("%d",&num_1)!=eof && num_1 != 0;printf(...))
主流的框架應該就是這樣的。 都能處理多組資料,可以當做模版記下。
至於第二個問題,要把各位數相加,主要得獲取每個位置的數字。
最早想的時候,我一直是想算出這個數有幾位,然後通過for迴圈,先%10求餘得到個位數,然後再/10使這個數各位數往後移,常規的想法,計算各個位置的數字。
但是問題出來了,怎麼求這個數的位數、? .length函式? 顯然在c中,這個不好實現,而在這樣的一道簡單題目中,不該涉及太多的問題。
於是乎,想唄。
於是乎,就有了新的思路。 沒必要先判斷位數,直接先%10求餘得到個位數,然後再/10使這個數各位數往後移,得到新的數字進行判斷,如果大於0,則說明該數還沒除盡,即還有數字可以相加。 換個思路,一下簡單多了。
至於第三個問題,更簡單了。 得到的新數字在大迴圈裡面判斷是否大於10.然後進行相應處理。
講到這裡,應該沒什麼問題了,問題不難,當是練手的。
下面貼上具體**:
#includeint main ( )
donum_1 = num_2;
}while (num_1 >= 10);
printf("%ld\n",num_2);
}}
很簡單的問題,c演算法的開始。 加油,與君共勉。
水平有限,如果錯誤,歡迎指正。
acm 輸入輸出總結
資料的輸入格式影響判斷迴圈終止的方式,迴圈判定發生在各組資料之間的輸入過程中和組內單個資料的輸入過程中,常見的資料輸入格式有三種 給出輸入規模 首先,輸入乙個整數n,n為輸入規模 然後,輸入n組資料。以特定輸入標誌結束 最後一組輸入為題目中指定的一組特定輸入,標誌輸入的結束。這組輸入一般為一組無意義...
acm 輸入輸出測試
1 巧用 scanf 當沒告訴你輸入幾個時 直接輸入一串數字,以空格分開,換行結束 int a maxn int n char c while scanf d c a n,c c n n 2 當沒告訴你有幾組資料時,只告訴你 每組資料的結束標誌,程式的結束標誌時 要採取順序結構的思想,while 判...
ACM入門之輸入輸出
include stdio.h int main 在開始做 acm時,會面臨乙個輸入輸出資料的問題,acm裡的輸入輸出資料和平時寫的程式不大一樣。下面詳解 acm有關輸入輸出的問題。一 輸入 1 只有一組測試資料,這時候是最簡單的了,請看題目 sdutoj1000。c語言 include stdio...