日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信息学奥赛一本通 1089:数字反转 | 1953:【11NOIP普及组】数字反转 | OpenJudge NOI 1.5 29 | 洛谷 P1307 [NOIP2011 普及组] 数字反转

發布時間:2025/3/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息学奥赛一本通 1089:数字反转 | 1953:【11NOIP普及组】数字反转 | OpenJudge NOI 1.5 29 | 洛谷 P1307 [NOIP2011 普及组] 数字反转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題目鏈接】

ybt 1089:數字反轉
ybt 1953:【11NOIP普及組】數字反轉
OpenJudge NOI 1.5 29:數字反轉
洛谷 P1307 [NOIP2011 普及組] 數字反轉

【題目考點】

1. 分離整數的各位數字

對于數字a,a%10可以取到其個位,a/=10(整除)可以去掉其當前個位。
重復這一過程,即可從低位到高位分離各位上的數字。
例:分離數字123的各位數

aa%10a/10
123312
1221
110

每次循環中,a變為a/10,循環中取a%10,為當前a的個位,即為分離出的數字。當a為0時循環結束。
其原理為對數字的按位權展開。
例:輸入一個正整數,從低位到高位輸出其各位數字,并用空格分隔,代碼為:

int n; cin>>n; for(int a = n; a > 0; a /= 10)//當n為0時,不會運行循環體cout<<a % 10<<' ';

2. 設標志位

設一個布爾類型變量,表示當前是否處于某種狀態,該變量稱為標志位。
在特定條件下改變該標志位,在任意時刻可以查詢該標志位。

  • 設標志位:bool flag = true;或bool flag = false;,標志位變量名稱和初始值根據具體情況而定。
  • 改變標志位:flag = true;或flag = false;。
  • 查詢標志位:if(flag)或if(flag == false)

3.循環控制語句

  • continue;:直接開始下一次循環。for循環中,會運行一次增量表達式。
  • break;:跳出當前循環

【解題思路】

解法1:設標志位

  • 首先判斷該數字是不是負數,如果是,直接輸出符號,并將該數字取反。
    下面使用“分離整數的各位數字”的方法,解決將一個正數反轉的問題。
  • 處理反轉后前幾個數字是0的問題
    • 設標志位isPreZero,初始值為true,isPreZero為true表示現在看到的數字是反轉后的前導0
    • 分離出當前數的個位數字
    • 如果isPreZero為true
      • 如果現在分離出的數字是0,則不輸出,直接開始下一次循環。
      • 如果分離出一個非0數字,將isPreZero設為false。
    • 輸出分離出的數字

解法2:數字組合

已知一個整數,我們可以做按位權展開

例: 1234=1?1000+2?100+3?10+41234 = 1*1000+2*100+3*10+41234=1?1000+2?100+3?10+4

若已知一個數字從高位到低位的各位數字,我們也可以將其組合成一個整數
數字組合就是按位權展開的逆過程。
如有前導0,也不會影響結果。

例:將0012組合為數字
0?1000+0?100+1?10+2=120*1000+0*100+1*10+2 = 120?1000+0?100+1?10+2=12

若數字很長,可以用循環完成數位組合
設num = 0,從高位到低位每次取出的數字是d,那么每次循環運行
num = num * 10 + d
即可將數字組合,組合后的數字為num。

例:將0012組合為數字
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:設標志位

#include<bits/stdc++.h> using namespace std; int main() {int n, d;cin >> n;if(n == 0)//n為0時無法進入下面的for循環 {cout << n;return 0;}else if(n < 0){cout << '-';n = -n;}bool isPreZero = true;//是否是輸出前導0的狀態 for(int a = n; a > 0; a /= 10) {d = a % 10;//分離出的一位數字if(isPreZero){if(d == 0)continue;elseisPreZero = false;}cout << d;}return 0; }

解法2:數字組合

#include<bits/stdc++.h> using namespace std; int main() {int n, d, num = 0;cin >> n;if(n == 0)//n為0時無法進入下面的for循環 {cout << n;return 0;}else if(n < 0){cout << '-';n = -n;}for(int a = n; a > 0; a /= 10) num = num * 10 + a % 10;//分離出的一位數字cout << num;return 0; }

總結

以上是生活随笔為你收集整理的信息学奥赛一本通 1089:数字反转 | 1953:【11NOIP普及组】数字反转 | OpenJudge NOI 1.5 29 | 洛谷 P1307 [NOIP2011 普及组] 数字反转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。