返回 课程
信奥AC之路-3级
0% 完成
0/0 步骤
-
第一课:数组基础4 主题|小节
-
第二课:数组基础二6 主题|小节
-
第三课:数组基础三6 主题|小节
-
第四课:数组基础四7 主题|小节
-
第五课:数组基础五5 主题|小节
-
第六课:数组用于统计,去重,排序5 主题|小节
-
第七课:冒泡排序6 主题|小节
-
第八课:数组连续性元素6 主题|小节
-
第九课:数组综合一7 主题|小节
-
第十课:字符数组7 主题|小节
-
第十一课:字符数组基础应用5 主题|小节
-
第十二课:字符数组基础应用二6 主题|小节
-
第十三课:字符数组进阶6 主题|小节
-
第十四课:字符串进阶二6 主题|小节
-
第十五课:字符串(STL)9 主题|小节
-
第十六课:字符串基础6 主题|小节
-
第十七课:字符串函数6 主题|小节
-
第十八课:字符串函数二4 主题|小节
-
第十九课:sort函数7 主题|小节
-
第二十课:字符串进阶7 主题|小节
-
第二十一课:字符串进阶二6 主题|小节
-
第二十二课:进制转换--十进制转其他进制5 主题|小节
-
第二十三课:进制转换--其他进制转十进制5 主题|小节
-
第二十四课:二进制,八进制,十六进制转换5 主题|小节
-
第二十五课:数据编码基础6 主题|小节
-
第二十六课:位运算基础6 主题|小节
课 进展
0% 完成
“最后,让我们学习一个通用的方法,”我总结道,”可以将十进制转换为2到16之间的任意进制。”
22.4.1 10进制转D进制
题目描述: 十进制整数 N 和其他 D(D的值为 2到16)进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一个简单算法基于下列原理: N = (N div d) × d + N mod d (其中:div 为整除运算,mod 为求余运算)。简单来说,就是除 D 取余,然后倒过来得到 D 进制的数。
例如:(1348)10=(10101000100)2,(1348)10=(2504)8,(1000)10=(3E8)16(请注意:转 16 进制时,用 A 代表余数 10 ,B 代表余数 11 ……)
假设现要编制一个满足下列要求的程序:对于输入的任意一个非负十进制整数(n≤1,000,000,000),打印输出与其等值的 D 进制数。
输入格式: 有两个整数 N 和 D,N 表示要转换的十进制非负整数, D 代表要转换的进制(2到16)
输出格式: N 进制转 D 进制的结果。
样例输入:
1348 2
样例输出:
10101000100
代码实现(方法一):
#include<bits/stdc++.h>
using namespace std;
int main(){
int a, d; // a是要转换的数,d是目标进制
cin >> a >> d; // 输入十进制数和目标进制
string s; // 用字符串存储结果
if(a == 0) s = "0"; // 特殊处理:0在任何进制下都是0
while(a){
int m = a % d; // 取余数
if(m > 9)
s = char(m - 10 + 'A') + s; // 10-15转为A-F
else
s = char(m + '0') + s; // 0-9直接转为字符
a /= d; // 除以目标进制
}
cout << s; // 输出结果
return 0;
}
代码实现(方法二):
#include<bits/stdc++.h>
using namespace std;
int main(){
string t = "0123456789ABCDEF"; // 进制转换字符表
int a, d; // a是要转换的数,d是目标进制
cin >> a >> d; // 输入十进制数和目标进制
string s; // 用字符串存储结果
if(a == 0) s = "0"; // 特殊处理:0在任何进制下都是0
while(a){
int m = a % d; // 取余数
s = t[m] + s; // 直接从字符表取对应字符
a /= d; // 除以目标进制
}
cout << s; // 输出结果
return 0;
}
算法解析:
方法一:
- 使用条件判断处理余数到字符的转换
- 余数0-9直接转为字符’0′-‘9’
- 余数10-15转为字符’A’-‘F’
方法二:
- 预先定义一个字符表,包含所有可能的进制字符
- 直接用余数作为下标,从字符表中取出对应字符
- 这种方法代码更简洁,思路更清晰