【NOI-題解】1108 - 正整數N轉換成一個二進制數1290 - 二進制轉換十進制1386 - 小麗找半個回文數1405 - 小麗找潛在的素數?

文章目錄

  • 一、前言
  • 二、問題
    • 問題:1108 - 正整數N轉換成一個二進制數
    • 問題:1290 - 二進制轉換十進制
    • 問題:1386 - 小麗找半個回文數
    • 問題:1405 - 小麗找潛在的素數?
  • 三、感謝

一、前言

本章節主要對進制轉換的題目進行講解,包括《1108 - 正整數N轉換成一個二進制數》《1290 - 二進制轉換十進制》《1386 - 小麗找半個回文數》《1386 - 小麗找半個回文數》題目。

二、問題

問題:1108 - 正整數N轉換成一個二進制數

類型:進制轉換


題目描述:

輸入一個不大于 32767 的整數 n ,將它轉換成一個二進制數。

輸入:

輸入只有一行,包括一個整數 (0 ≤ n ≤ 32767)。

輸出:

輸出只有一行。

樣例1:

輸入:

100

輸出:

1100100

樣例2:

輸入:

0

輸出:

0

在這里插入圖片描述


1.分析問題

  1. 已知:一個不大于 32767 的整數 n。
  2. 未知:將它轉換成一個二進制數。
  3. 關系:進制轉換

2.定義變量

  • n; 用于存儲待轉換的整數。
  • v; 用于存儲轉換后的二進制位,每個元素代表一位,0 或 1。
	//二、定義變量(已知、未知、關系) int n;vector<int> v; 

3.輸入數據

  • 從標準輸入讀取一個整數。
	//三、輸入已知cin>>n;

4.數據計算

  • 使用while(n)循環,當n不為0時執行循環體。
  • 取n的當前最低位(n % 2),將其添加到vector的末尾。
  • 將n右移一位,相當于除以2并向下取整,繼續處理下一位。
//四、根據關系計算while(n){v.push_back(n%2);n/=2;}

5.輸出結果

  • 在轉換完成后,先檢查vector是否為空。若為空,則直接輸出0。
  • 否則,從vector的末尾開始遍歷到開頭,逐個輸出vector中的元素,即得到了該整數的二進制表示。
//五、輸出未知 if(v.empty()){cout<<0;}else{for(int i=v.size()-1;i>=0;i--){cout<<v[i];}}return 0;

完整代碼如下:

#include<bits/stdc++.h> // 包含通用頭文件,提供所有常用的標準庫功能
using namespace std;    // 使用標準命名空間std,簡化代碼中的庫函數調用int main() {            // 程序入口點// 一、分析問題// 目標:將一個不大于32767的十進制整數轉換為二進制表示// 二、定義變量int n;               // 存儲用戶輸入的整數vector<int> v;       // 使用vector來存儲整數的二進制位,每個元素代表一位(0或1)// 三、輸入cin >> n;            // 從標準輸入讀取一個整數n// 四、轉換過程while(n) {           // 當n非零時執行循環v.push_back(n % 2); // 取n的當前最低位(n除以2的余數),加入到vector末尾n /= 2;           // n右移一位,即n除以2并向下取整,繼續處理下一位}// 五、輸出// 檢查vector是否為空(理論上這里可以直接輸出"0",因為當n為0時,循環不會執行,直接進入此邏輯)if(v.empty()) {cout << 0;       // 如果vector為空(即輸入的n為0),直接輸出"0"} else {// 遍歷vector,從最后一個元素開始向前遍歷,輸出二進制位for(int i = v.size() - 1; i >= 0; i--) {cout << v[i]; // 輸出當前位}}// 結束程序return 0;            // 主函數正常結束,返回0
}

問題:1290 - 二進制轉換十進制

類型:進制轉換、字符串


題目描述:

請將一個 25 位以內的 2 進制正整數轉換為 10 進制!

輸入:

一個 25 位以內的二進制正整數。

輸出:

該數對應的十進制。

樣例:

輸入:

111111111111111111111111

輸出:

16777215

在這里插入圖片描述


1.分析問題

  1. 已知:一個 25 位以內的 2 進制正整數;
  2. 未知:轉換為 10 進制;
  3. 關系:二進制轉十進制。

2.定義變量

  • s 用于存儲輸入的二進制。
  • res 初始化結果變量,用于存放轉換后的十進制數值。
	//二、定義變量(已知、未知、關系)string s;int res=0; 

3.輸入數據

  • 從標準輸入讀取一個二進制字符串。
	//三、輸入已知cin>>s;

4.數據計算

  • 使用一個循環遍歷輸入字符串s的每一個字符(從末位到首位)。
  • 初始化一個變量t用于記錄當前位的權重,初始為1(即2^0)。
  • 將當前字符(‘0’或’1’)減去字符’0’得到其對應的整數值(0或1),然后乘以當前位的權重t,累加到結果res中。
  • 在每次迭代后,將權重t乘以2,以便處理下一位的二進制位。
	//四、根據關系計算int t=1;for(int i=s.size()-1;i>=0;i--){res+=(s[i]-'0')*t;t*=2;}

5.輸出結果

  • 輸出轉換后的十進制數值。
//五、輸出未知 cout<<res;

完整代碼如下:

#include <bits/stdc++.h> // 包含頭文件,提供了所有常用的標準庫功能
using namespace std;    // 使用標準命名空間std,簡化代碼中的庫函數調用int main() {            // 程序入口點// 一、問題分析// 已知條件:一個長度不超過25位的二進制正整數// 目標:將此二進制數轉換為十進制數// 二、變量定義string s;           // 存儲二進制字符串int res = 0;        // 初始化轉換結果為0// 三、輸入二進制cin >> s;           // 從標準輸入讀取一個二進制// 四、二進制轉十進制計算int t = 1;          // 初始化當前位的權重為2^0 = 1for(int i = s.size() - 1; i >= 0; i--) { // 從字符串末位開始遍歷到首部// 將字符數字('0'或'1')轉換為其對應的整數值(0或1),然后乘以其權重t,累加到res中res += (s[i] - '0') * t;// 每處理完一位,權重t翻倍,相當于下一位的權重(2^n)t *= 2;}// 五、輸出十進制結果cout << res;         // 輸出轉換得到的十進制數return 0;            // 主函數正常結束,返回0
}

問題:1386 - 小麗找半個回文數

類型:進制轉換


題目描述:

小麗同學在編程中學到了回文數的概念,如果一個數正過來讀和反過來讀是同一個數,那么這個數就是回文數;比如:2、5、8、66、121、686、12321 都是回文數,小麗發現,這樣的數不算多。

于是小麗有個想法,如果這個數不是回文數,但這個數在 2 進制或者 16 進制下是回文數,就算這個整數是半個回文數,比如 417 并不是回文,但 417 對應的 16 進制數是 1A1 是回文數,因此 417 算半個回文數。

請你編程幫助小麗找符合條件的半個回文數。

輸入:

第一行是一個整數 n(5≤n≤100); 第二行是 n 個整數(這些整數都是 [0,10^8] 之間的整數);

輸出:

所有符合條件的半個回文數,每行一個。

樣例:

輸入:

5
121 417 27 100 21

輸出:

417
27
21

在這里插入圖片描述


1.分析問題

  1. 已知:n個整數;
  2. 未知:找符合條件的半個回文數。
  3. 關系:這個數不是回文數,但這個數在 2 進制或者 16 進制下是回文數,就算這個整數是半個回文數

2.定義變量

	int n;string s,binary,hexa;

3.輸入數據

  • 程序接收用戶輸入的整數數量n。
	//三、輸入已知cin>>n;
  • 隨后,對于每一個輸入的整數s,程序先檢查它是否為回文數,如果是則跳過(因為它不符合“半個回文數”的定義)。
	for(int i=0;i<n;i++){cin>>s;}
  • 接著,將s分別轉換為二進制和十六進制形式,并檢查這兩種形式是否為回文。只要其中任一是回文,就輸出原始的整數s。
		if(checkHW(s)) continue;//四、根據關系計算binary=decbin(s);hexa=dechex(s);//五、輸出未知 if(checkHW(binary)||checkHW(hexa)){cout<<s<<endl;}

4.數據計算

  • 此函數通過創建字符串的逆序副本并比較兩者是否相等來判斷給定字符串是否為回文。
bool checkHW(string t){string re=t;reverse(re.begin(),re.end());return t==re;
}
  • 將輸入的十進制字符串轉換為二進制。
string decbin(string dec){int ndec=0,t;char c;string bin;for(int i=0;i<dec.size();i++){ndec=ndec*10+(dec[i]-'0');}while(ndec){t=ndec%2;c=t+'0';bin=c+bin;ndec/=2;}return bin;
}
  • 將輸入的十進制字符串轉換為十六進制字符串

string dechex(string  dec){int ndec=0,t;char c;string hex;for(int i=0;i<dec.size();i++){ndec=ndec*10+(dec[i]-'0');}while(ndec){t=ndec%16;if(t<=9){c=t+'0';}else{c=t-10+'A';}hex=c+hex;ndec/=16;}return hex;
}

5.輸出結果

//五、輸出未知 if(checkHW(binary)||checkHW(hexa)){cout<<s<<endl;}

完整代碼如下:

#include<bits/stdc++.h> // 包含常用頭文件,簡化代碼,但非標準,建議具體指定所需頭文件
using namespace std; // 使用std命名空間,允許直接使用std內的函數和對象,但可能引起命名沖突// 檢查字符串是否為回文
bool checkHW(string t){string re = t; // 復制字符串treverse(re.begin(), re.end()); // 反轉字符串return t == re; // 比較原字符串與反轉后的字符串是否相等
}// 十進制字符串轉二進制字符串
string decbin(string dec){int ndec = 0; // 初始化十進制數值for(int i=0; i<dec.size(); i++){ // 遍歷輸入字符串ndec = ndec * 10 + (dec[i] - '0'); // 將字符數字轉換為整數并累加}string bin; // 初始化二進制字符串while(ndec){ // 當十進制數不為0時bin = (ndec % 2 ? '1' : '0') + bin; // 將余數添加到二進制字符串前部ndec /= 2; // 整除2進行下一輪}return bin; // 返回二進制字符串
}// 十進制字符串轉十六進制字符串
string dechex(string dec){int ndec = 0; // 初始化十進制數值for(int i=0; i<dec.size(); i++){ // 遍歷輸入字符串ndec = ndec * 10 + (dec[i] - '0'); // 將字符數字轉換為整數并累加}string hex; // 初始化十六進制字符串const char* digits = "0123456789ABCDEF"; // 十六進制字符表while(ndec){ // 當十進制數不為0時hex = digits[ndec % 16] + hex; // 添加對應的十六進制字符到字符串前部ndec /= 16; // 整除16進行下一輪}return hex; // 返回十六進制字符串
}int main(){// 主函數開始int n; // 定義整數n存儲輸入的整數數量cin >> n; // 讀取整數nfor(int i=0; i<n; i++){ // 循環處理n個整數string s; // 存儲當前輸入的整數字符串cin >> s; // 讀取一個整數// 如果該整數本身就是回文,則跳過if(checkHW(s)) continue;// 轉換并檢查二進制和十六進制形式string binary = decbin(s); string hexa = dechex(s);// 如果二進制或十六進制形式是回文,則輸出原整數if(checkHW(binary) || checkHW(hexa)){cout << s << endl; // 輸出整數}}// 主函數結束return 0; // 程序正常退出
}

問題:1405 - 小麗找潛在的素數?

類型:進制轉換


題目描述:

小麗同學在編程中學到了二進制數的概念,她發現,有些二進制數,如果轉為 10 進制,就是素數,小麗把這些數稱為潛在的素數;比如 2 進制 1101011,轉為 10 進制后為 107 ,就是素數。

請編程幫小麗找出,哪些二進制數轉為 10 進制后,是素數,計算出這樣的數有多少個?

輸入:

第一行是一個整數 (10≤n≤100)。

接下來 n 行,每行是一個 30 位以內的 2 進制數

輸出:

一個整數代表所有轉為 10 進制后是素數的 2 進制數的個數。

樣例:

輸入:

6
1010000
1011
1101001
10111
111
1101011

輸出:

4

在這里插入圖片描述


1.分析問題

  1. 已知:n個 30 位以內的 2 進制數;

  2. 未知:輸出所有轉為 10 進制后是素數的 2 進制數的個數。

  3. 關系:進制轉換。

2.定義變量

	//二、定義變量(已知、未知、關系)int n,c=0,t;string s; 

3.輸入數據

  • 首先讀取一個整數n,表示有n個二進制數需要處理。
  • 接下來進行n次循環,每次循環讀取一個二進制字符串s。
	//三、輸入已知cin>>n;for(int i=0;i<n;i++){cin>>s;}

4.數據計算

  • 將二進制字符串b轉換為十進制整數。它從字符串的末尾開始遍歷,累積每一位的值(通過減去字符’0’得到數字)并乘以當前的基數(初始為1,每次循環乘以2)。
int bindec(string b){int dec=0,q=1;for(int i=b.size()-1;i>=0;i--){dec+=(b[i]-'0')*q;q*=2;}return dec;}
  • 判斷一個整數p是否為素數。
bool isPrime(int p){if(p<=3) return p>1;for(int i=2;i*i<=p;i++){if(p%i==0) return false;}return true;
}
  • 調用bindec將其轉換為十進制數t,再用isPrime判斷t是否為素數。如果是,則計數器c加1。
	//四、根據關系計算t=bindec(s);if(isPrime(t)) ++c;

5.輸出結果

  • 循環結束后,輸出計數器c的值,即轉換后是素數的二進制數的個數。
	//五、輸出未知 cout<<c;

完整代碼如下:

#include<bits/stdc++.h> // 包含所有常用頭文件
using namespace std;    // 使用std命名空間,簡化代碼中標準庫的使用// 函數:將二進制字符串轉換為十進制整數
int bindec(string b){int dec = 0, q = 1; // 初始化十進制數為0,權重為1(2的0次冪)for(int i = b.size() - 1; i >= 0; i--){ // 從字符串末尾開始遍歷dec += (b[i] - '0') * q;           // 將當前位的二進制值加到十進制數上q *= 2;                             // 權重翻倍,對應二進制位的移動}return dec; // 返回轉換后的十進制數
}// 函數:判斷一個整數是否為素數
bool isPrime(int p){if(p <= 3) return p > 1; // 處理p為1, 2, 3的情況,其中2和3是素數for(int i = 2; i * i <= p; i++){ if(p % i == 0 ) return false; }return true; // 所有可能的因子都檢查過了,p是素數
}int main(){// 主函數開始int n, count = 0; // n表示二進制數的個數,count用于統計素數的個數string binary;    // 用于存儲輸入的二進制字符串// 輸入二進制數的個數ncin >> n;// 循環讀取n個二進制數,并檢查它們轉換為十進制后是否為素數for(int i = 0; i < n; i++){cin >> binary; // 輸入一個二進制數int decimal = bindec(binary); // 轉換為十進制if(isPrime(decimal)) ++count; // 如果是素數,計數器加1}// 輸出統計結果cout << count << endl; // 輸出轉換后為素數的二進制數的數量return 0; // 程序結束
}

三、感謝

如若本文對您的學習或工作有所啟發和幫助,懇請您給予寶貴的支持——輕輕一點,為文章點贊;若覺得內容值得分享給更多朋友,歡迎轉發擴散;若認為此篇內容具有長期參考價值,敬請收藏以便隨時查閱。

每一次您的點贊、分享與收藏,都是對我持續創作和分享的熱情鼓勵,也是推動我不斷提供更多高質量內容的動力源泉。期待我們在下一篇文章中再次相遇,共同攀登知識的高峰!

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44124.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44124.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44124.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu下aarch64-linux-gnu(交叉編譯) gdb/gdbserver

ubuntu下aarch64-linux-gnu(交叉編譯) gdb/gdbserver gdb是一款開源的、強大的、跨平臺的程序調試工具。主要用于在程序運行時對程序進行控制和檢查&#xff0c;如設置斷點、單步執行、查看變量值、修改內存數據等&#xff0c;從而幫助開發者定位和修復代碼中的錯誤。 gdbserve…

密態計算,大模型商用數據瓶頸的新解法?

大數據產業創新服務媒體 ——聚焦數據 改變商業 大模型邁向產業的深度應用&#xff0c;首要挑戰是高質量數據供給和安全流通。正如在今年的世界人工智能大會上&#xff0c;產學研屆多位專家達成的共識是&#xff0c;數據決定了AI能力的上限。 在實踐中&#xff0c;行業大模型難…

C#創建windows服務程序

步驟 1: 創建Windows服務項目 打開Visual Studio。選擇“創建新項目”。在項目類型中搜索“Windows Service”并選擇一個C#模板&#xff08;如“Windows Service (.NET Framework)”&#xff09;&#xff0c;點擊下一步。輸入項目名稱、位置和其他選項&#xff0c;然后點擊“創…

Pyecharts繪制熱力圖的說明+代碼實戰

引言 熱力圖在數據可視化中是一種強大的工具&#xff0c;可以直觀地展示數據的分布情況和變化趨勢。Pyecharts是一個基于Echarts的Python可視化庫&#xff0c;提供了豐富的圖表類型&#xff0c;包括熱力圖。在本文中&#xff0c;我們將深入探討Pyecharts繪制多種炫酷熱力圖的參…

Qt 創建的窗口一閃而過【已解決】

Qt 創建的窗口一閃而過 引言一、詳細的解決方案 - 附代碼二、參考博文 引言 創建的窗口一閃而過&#xff0c;就是創建完立馬被銷毀了&#xff0c;常見情況是在一個函數中創建窗口并show() - 即創建在了棧上&#xff0c;函數結束局部變量(窗口)自動被釋放。主流的解決方法有兩種…

如何使用css把input框的number屬性的右側小按鈕去掉

在HTML中&#xff0c;當<input>元素的type屬性被設置為number時&#xff0c;瀏覽器通常會默認顯示一個小的上下箭頭按鈕&#xff08;通常位于輸入框的右側&#xff09;&#xff0c;用于允許用戶通過點擊增加或減少輸入的值。然而&#xff0c;有時候為了設計的一致性或其他…

C語言快速入門

Linux C 的編譯流程 C 編譯器 gcc GNUmsvc windowsclang 蘋果intel…cc 默認Linux c語言編譯器 程序設計語言分類 編譯型 C、C、java 把源代碼轉換成機械指令&#xff08;X86 電腦、ARM 手機&#xff09;編譯做了類型安全檢查&#xff0c;安全性能高靈活差 解釋型 Python、…

三生隨記——毛巾的詛咒

在一個沉悶的傍晚&#xff0c;李明拖著疲憊的身軀回到了家中。一整天的工作讓他精疲力竭&#xff0c;此刻他只想趕緊洗個熱水澡&#xff0c;然后躺在舒適的床上&#xff0c;好好放松一下。 走進浴室&#xff0c;他打開淋浴&#xff0c;溫暖的水流傾灑在身上&#xff0c;疲憊感…

Oracle 利用觸發器鎖住代碼防止他人改動

利用觸發器鎖住自己的代碼防止他人改動 create or replace trigger LockSourcebeforecreateon SCHEMA declare beginif SYS_CONTEXT(USERENV,OS_USER) 自己的機器名thenreturn;end if;if ora_dict_obj_name in (xxxx1_PACKAGE,xxxx2_PACKAGE)thenraise_application_error(-2…

每日刷題(二分查找,匈牙利算法,逆序對)

目錄 1.Sarumans Army 2.Catch That Cow 3.Drying 4.P3386 【模板】二分圖最大匹配 5. Swap Dilemma 1.Sarumans Army 3069 -- Sarumans Army (poj.org) 這道題就是要求我們在給的的位置放入 palantir&#xff0c;每個 palantir有R大小的射程范圍&#xff0c;要求求出最少…

生產訂單執行明細表二開增加字段

文章目錄 生產訂單執行明細表二開增加字段業務背景業務需求方案設計詳細設計和實現標準報表引入到應用標準報表和過濾擴展添加字段創建插件&#xff0c;掛載插件新建類庫 Krystal.K3.SCGL.App.Report&#xff0c;添加引用創建類&#xff0c;繼承報表原插件重寫BuilderReportSql…

【微服務】Spring Cloud中如何使用Eureka

文章目錄 強烈推薦引言主要功能Eureka 的架構使用示例Eureka Server 配置Eureka Client 配置示例服務服務發現調用示例 Spring Cloud如何實現服務的注冊?1. 搭建 Eureka 服務注冊中心2. 配置服務注冊到 Eureka3. 驗證服務注冊 總結應用場景1. 動態服務發現2. 負載均衡3. 服務治…

Android C++系列:Linux進程間關系

1. 終端 在UNIX系統中,用戶通過終端登錄系統后得到一個Shell進程,這個終端成為Shell進 程的控制終端(Controlling Terminal),在前面文章我們說過,控制終端是保存在PCB中的信 息,而我們知道fork會復制PCB中的信息,因此由Shell進程啟動的其它進程的控制終端也是 這個終端。…

OpenCV進行視頻分析(光流、目標跟蹤)----20240710

一、OpenCV進行光流分析 # 光流分析螞蟻軌跡 import numpy as np import cv2if __name__ == __main__:cap = cv2.VideoCapture(./pictures/ant.mp4)# ShiTomasi 角點檢測參數feature_params = dict(maxCorners=100

基于Java中的SSM框架實現水稻朔源信息系統項目【項目源碼】

基于Java中的SSM框架實現水稻朔源信息系統演示 SSM框架 SSM框架是基于Spring、SpringMVC以及Mybatis實現的針對JAVA WEB端應用的開發框架&#xff0c;通過SSM框架結構可以實現以上三種框架的優點集合&#xff0c;從而實現更加高效便捷的系統開發和呈現。該框架結構通過Spring框…

PolarisMesh源碼系列——服務如何注冊

前話 PolarisMesh&#xff08;北極星&#xff09;是騰訊開源的服務治理平臺&#xff0c;致力于解決分布式和微服務架構中的服務管理、流量管理、配置管理、故障容錯和可觀測性問題&#xff0c;針對不同的技術棧和環境提供服務治理的標準方案和最佳實踐。 PolarisMesh 官網&am…

main.cpp程序執行流程圖

當然&#xff0c;我會為你繪制一個程序執行流程圖&#xff0c;并用中文注釋來解釋 main.cpp 的代碼邏輯思想和執行流程。 程序執行流程圖 開始|V 初始化|V 打開攝像頭 (VideoCapture cap(0))|V 進入主循環 (while (true))|V 捕獲圖像 (cap >> srcImage)|V 圖像是否為空…

280個地級市金融集聚水平數據(2006-2022年)

2006年-2022年280個地級市金融集聚水平數據整理資源-CSDN文庫 金融集聚水平&#xff1a;衡量地級市金融發展的新維度 金融集聚水平是衡量一個地區金融發展程度的重要指標&#xff0c;它反映了金融機構、金融資源、金融服務在特定時間和空間的集中程度。這一指標的評估可以從多…

根據H在有限域GF(2^m)上求解生成矩陣G

原理 有時間再補充。 注1&#xff1a;使用高斯消去法。如果Py不為單位陣&#xff0c;則說明進行了列置換&#xff0c;此時G不是系統形式。 注2&#xff1a;校驗矩陣H必須是行滿秩才存在對應的生成矩陣G&#xff0c;且生成矩陣G通常不唯一。 matlab實現&#xff1a;只做列置…

視語坤川大模型智能體平臺亮相2024世界人工智能大會

7月4日-7月7日&#xff0c;以“以共商促共享以善治促善智”為主題的2024世界人工智能大會&#xff08;WAIC 2024&#xff09;在上海舉辦&#xff0c;世界頂級專家學者、知名企業代表、政界人士、高校組織等齊聚上海&#xff0c;共商發展、共話未來。 作為大會的重磅環節——昇…