信息学奥赛一本通 1089:数字反转 | 1953:【11NOIP普及组】数字反转 | OpenJudge NOI 1.5 29 | 洛谷 P1307 [NOIP2011 普及组] 数字反转
【題目鏈接】
ybt 1089:數(shù)字反轉(zhuǎn)
ybt 1953:【11NOIP普及組】數(shù)字反轉(zhuǎn)
OpenJudge NOI 1.5 29:數(shù)字反轉(zhuǎn)
洛谷 P1307 [NOIP2011 普及組] 數(shù)字反轉(zhuǎn)
【題目考點(diǎn)】
1. 分離整數(shù)的各位數(shù)字
對(duì)于數(shù)字a,a%10可以取到其個(gè)位,a/=10(整除)可以去掉其當(dāng)前個(gè)位。
重復(fù)這一過程,即可從低位到高位分離各位上的數(shù)字。
例:分離數(shù)字123的各位數(shù)
| 123 | 3 | 12 |
| 12 | 2 | 1 |
| 1 | 1 | 0 |
每次循環(huán)中,a變?yōu)閍/10,循環(huán)中取a%10,為當(dāng)前a的個(gè)位,即為分離出的數(shù)字。當(dāng)a為0時(shí)循環(huán)結(jié)束。
其原理為對(duì)數(shù)字的按位權(quán)展開。
例:輸入一個(gè)正整數(shù),從低位到高位輸出其各位數(shù)字,并用空格分隔,代碼為:
2. 設(shè)標(biāo)志位
設(shè)一個(gè)布爾類型變量,表示當(dāng)前是否處于某種狀態(tài),該變量稱為標(biāo)志位。
在特定條件下改變?cè)摌?biāo)志位,在任意時(shí)刻可以查詢?cè)摌?biāo)志位。
- 設(shè)標(biāo)志位:bool flag = true;或bool flag = false;,標(biāo)志位變量名稱和初始值根據(jù)具體情況而定。
- 改變標(biāo)志位:flag = true;或flag = false;。
- 查詢標(biāo)志位:if(flag)或if(flag == false)
3.循環(huán)控制語(yǔ)句
- continue;:直接開始下一次循環(huán)。for循環(huán)中,會(huì)運(yùn)行一次增量表達(dá)式。
- break;:跳出當(dāng)前循環(huán)
【解題思路】
解法1:設(shè)標(biāo)志位
- 首先判斷該數(shù)字是不是負(fù)數(shù),如果是,直接輸出符號(hào),并將該數(shù)字取反。
下面使用“分離整數(shù)的各位數(shù)字”的方法,解決將一個(gè)正數(shù)反轉(zhuǎn)的問題。 - 處理反轉(zhuǎn)后前幾個(gè)數(shù)字是0的問題
- 設(shè)標(biāo)志位isPreZero,初始值為true,isPreZero為true表示現(xiàn)在看到的數(shù)字是反轉(zhuǎn)后的前導(dǎo)0
- 分離出當(dāng)前數(shù)的個(gè)位數(shù)字
- 如果isPreZero為true
- 如果現(xiàn)在分離出的數(shù)字是0,則不輸出,直接開始下一次循環(huán)。
- 如果分離出一個(gè)非0數(shù)字,將isPreZero設(shè)為false。
- 輸出分離出的數(shù)字
解法2:數(shù)字組合
已知一個(gè)整數(shù),我們可以做按位權(quán)展開
例: 1234=1?1000+2?100+3?10+41234 = 1*1000+2*100+3*10+41234=1?1000+2?100+3?10+4
若已知一個(gè)數(shù)字從高位到低位的各位數(shù)字,我們也可以將其組合成一個(gè)整數(shù)
數(shù)字組合就是按位權(quán)展開的逆過程。
如有前導(dǎo)0,也不會(huì)影響結(jié)果。
例:將0012組合為數(shù)字
0?1000+0?100+1?10+2=120*1000+0*100+1*10+2 = 120?1000+0?100+1?10+2=12
若數(shù)字很長(zhǎng),可以用循環(huán)完成數(shù)位組合
設(shè)num = 0,從高位到低位每次取出的數(shù)字是d,那么每次循環(huán)運(yùn)行
num = num * 10 + d
即可將數(shù)字組合,組合后的數(shù)字為num。
例:將0012組合為數(shù)字
num = 0;
num = num * 10 + 0;//num為0
num = num * 10 + 0;//num為0
num = num * 10 + 1;//num為1
num = num * 10 + 2;//num為12
用這種方法完成該問題
【題解代碼】
解法1:設(shè)標(biāo)志位
#include<bits/stdc++.h> using namespace std; int main() {int n, d;cin >> n;if(n == 0)//n為0時(shí)無(wú)法進(jìn)入下面的for循環(huán) {cout << n;return 0;}else if(n < 0){cout << '-';n = -n;}bool isPreZero = true;//是否是輸出前導(dǎo)0的狀態(tài) for(int a = n; a > 0; a /= 10) {d = a % 10;//分離出的一位數(shù)字if(isPreZero){if(d == 0)continue;elseisPreZero = false;}cout << d;}return 0; }解法2:數(shù)字組合
#include<bits/stdc++.h> using namespace std; int main() {int n, d, num = 0;cin >> n;if(n == 0)//n為0時(shí)無(wú)法進(jìn)入下面的for循環(huán) {cout << n;return 0;}else if(n < 0){cout << '-';n = -n;}for(int a = n; a > 0; a /= 10) num = num * 10 + a % 10;//分離出的一位數(shù)字cout << num;return 0; }總結(jié)
以上是生活随笔為你收集整理的信息学奥赛一本通 1089:数字反转 | 1953:【11NOIP普及组】数字反转 | OpenJudge NOI 1.5 29 | 洛谷 P1307 [NOIP2011 普及组] 数字反转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(1234:2011)
- 下一篇: 信息学奥赛一本通 1985:【19CSP