本題是浙江理工大學ACM入隊200題第二套中的H題
我們先來看一下這題的題面.
由于是比較靠前的題目,這里插一句.各位新ACMer朋友們,請一定要養成仔細耐心看題的習慣,尤其是要利用好輸入和輸出樣例.
- 樣例相當于給你舉了個具體的例子,可以幫助你更好的理解題目
- 樣例會告訴你輸入和輸出的格式,你必須要在程式里以這樣的格式輸入和輸出,否則會出問題
- 樣例可以在你本地寫完代碼之后用作測驗,來檢查你的代碼能否正常地運行(不過樣例運行正確并不代表完全對了,可能輸入其他的資料會出現別的問題)
題面
題目描述
輸入1個3位數,分離出它的百位、十位和個位,反轉后輸出
輸入
輸入1個3位整數
輸出
輸出3位整數的反轉數
樣例輸入
250
樣例輸出
052
提示
分離出各位數字可以用取余和除數
注意在C語言里,2個整數相乘除結果還是整數 比如8/3在C語言里結果是2
取余采用符號%
比如8%3的結果應該是2即8除以3后的余數
題目分析
想要倒序輸出3位數,首先我們必須取出這個三位數中的各個位,而這題對于新朋友們來說最難的點可能是取出數字中的各個位了,不過好在仁慈的葉教給出了提示.
我們可以通過對10取余來得到當前數字的個位,對10整除取得當前數字去掉最后一位(即十進制位右移一位)后的數字:

同理也可推出對100取余、對100整除等操作的效果,取n進制的某一位同樣也可使用類似的操作完成.
所以對于這題我們只需要通過上述操作的組合取出各個位上的數字,再將其反過來輸出即可.
取出各個位上的數字的區域參考代碼如下:
int a = n / 100; // 取出百位(如果實在不能直接理解,可看成先/10去掉個位變為兩位數(如250->25),再/10去掉新的個位變為1位數(如25->2),這樣就是百位了)
int b = n / 10 % 10; // 取出十位(先去/10掉個位(250->25),再取%10新的個位,即十位)
int c = n % 10; // 取出個位
常見錯誤思路
解決了上述的難點之后,有些朋友們就掉坑了.這題的一個坑點就出現在倒序輸出上,不過好在可以直接通過樣例輸入發現這個問題.
這些朋友們的倒序輸出的思路是這樣的,既然我可以反著十進制的規則取出各個十進制位,那我也可以正著十進制的規則算出倒過來的數,于是他們寫出了如下的代碼(區域)
int res = c * 100 + b * 10 + a; // 根據十進制的定義求出倒序后的十進制數
常見錯誤原因決議
這樣寫在數學上確實沒什么大問題,但是注意看這里的輸出樣例,我們的程式需要實作的是250->052而不是250->52,也就是說在這道題里,不能通過算出倒序后的數這種方式來解決,因為對于一個數字而言,首位的0是會省略的(如果題目要求要沒有首位0,那確實可以這么寫,因題而異).
這里就體現出了仔細看輸入和輸出樣例的重要性了吧!各位朋友們一定要仔細耐心看題哦!
解決方案
那怎么辦呢,很簡單鴨,直接一個一個數字輸出不就好了嘛(本質是字串拼接),區域參考代碼如下:
printf("%d%d%d", c, b, a); // 將三個位按逆序逐個輸出
參考代碼
下面給出了我自己做這道題時候的完整代碼:
(僅作為參考,一定要自己寫一下奧,作弊沒意思,害人又害己)
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int a = n / 100; // 取出百位(如果實在不能直接理解,可看成先/10去掉個位變為兩位數(如250->25),再/10去掉新的個位變為1位數(如25->2),這樣就是百位了)
int b = n / 10 % 10; // 取出十位(先去/10掉個位(250->25),再取%10新的個位,即十位)
int c = n % 10; // 取出個位
printf("%d%d%d\n", c, b, a); // 將三個位按逆序逐個輸出
return 0;
}
提高
回圈出隊
其實,在學了回圈之后,這道題還可以利用回圈逐個取出各個位上的數字.
這種思路的出發點便是%10可以取個位而同時/10可以去個位,所以我們可以通過一個while回圈,不斷取出個位再去掉個位,將操作前的十位不斷移至個位,直到無位可移(即數變為0),此時所有位已經全部倒序取出,回圈結束.
參考代碼(區域):
int n;
scanf("%d", &n);
while(n) // 即n != 0,n當前還有位未處理
{
printf("%d", n % 10); // 取出當前的個位
n /= 10; // 去掉當前已取出的個位,讓前面的十位變成個位進行下一次回圈中的操作
}
printf("\n");
第4套的問題C是可以通過這種方式解決的(只需要在回圈中加一個計數器即可判斷位數),這題問的也相對比較多,建議收藏這篇題解,屆時如果有問題可以回過來看此段內容,不單獨發了.
字串倒序輸出
此外,在學了字串之后,這道題的逐個取出各個十進制位再逆序完全可以依托字串的特點,直接將輸入作為字串倒序輸出即可解決,這里就只給出參考代碼(區域)了,學過字串的話應該可以立馬理解的:
char n[5]; // 注意字串習慣性開大一點,防止'\0'溢位
scanf("%s", n);
// 普普通通倒序輸出字串,注意別寫成i++了
for(int i = strlen(s) - 1; i >=0 ; i--)
{
printf("%c", n[i]);
}
printf("\n");
第4套的問題C也可以通過這種方式解決(字串的有效長度就是位數).
這篇題解就到這里了,各位朋友如果有問題歡迎到acm成員群中提問哦!
這里是浙江理工大學22屆ACM集訓隊的成員一枚鴨!
本文首發于博客園,作者:星雙子,除了我自己的轉載請注明原文鏈接:https://www.cnblogs.com/gemini-star/p/zstuACM200_2H.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/509261.html
標籤:其他
上一篇:目錄和檔案管理4
