题单地址:题单中心-东方博宜OJ
这里以十进制转二进制为例(除2取余法):
1108. 正整数N转换成一个二进制数
问题描述
输入一个不大于 32767 的整数 n ,将它转换成一个二进制数。
输入
输入只有一行,包括一个整数 n (0 ≤ n ≤ 32767)。
输出
输出只有一行。
样例
输入
100
输出
1100100
输入
0
输出
0
解析:使用除法计算,不断除以2,将余数加入到字符串中,在倒序遍历即可。
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
int n;
cin >> n;
if(n == 0)cout << n;
while(n){
s = char(n % 2 + '0') + s;
n /= 2;
}
cout << s;
return 0;
}
1289. 正整数n转换为16进制
问题描述
请从键盘读入一个非负整数 n( n 是一个不超过 18 位的非负整数),将 n 转换为 16 进制!
注意:16 进制即逢 16 进 1,每一位上可以是从小到大为 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F 共 16 个大小不同的数,即逢 16 进 1,其中用 A,B,C,D,E,F 这六个字母来分别表示 10,11,12,13,14,15。
如:60 的十六进制为 3C。(字母请用大写)
输入
一个不超过 18 位的非负整数 n 。
输出
该数的十六进制值。
样例
输入
100000000000
输出
174876E800
解析: 使用除法计算,不断除以16,将余数加入到字符串中,要注意10~15要用用字母A~F表达,最后在倒序遍历即可。
#include <bits/stdc++.h>
using namespace std;
int main() {
string s = "";
long long n;
char a[20] = "0123456789ABCDEF";
cin >> n;
while(n){
s = a[n % 16] + s;
n /= 16;
}
if(s == "")cout << 0;
else cout << s;
return 0;
}
1288. 正整数n转换为8进制
问题描述
请将一个整数 n( n ≤ 10^12 )的整数转换为 8 进制!
输入
整数 n 。
输出
n 的 8 进制对应的数。
样例
输入
100000
输出
303240
解析: 使用除法计算,不断除以8,将余数加入到字符串中,最后在倒序遍历即可。
#include <bits/stdc++.h>
using namespace std;
int main() {
string s = "";
long long n;
char a[20] = "01234567";
cin >> n;
while(n){
s = a[n % 8] + s;
n /= 8;
}
if(s == "")cout << 0;
else cout << s;
return 0;
}
1547. 小X转进制
问题描述
小X喜欢研究进制转换。
在了解了进制转换的一般流程后,小X突然想起了以前学过的回文数(正着读倒着读都一样的数),于是开始思考一个奇怪的问题:1 到 N 中有多少个整数的平方在 M 进制下是回文数呢?
小X随手列了几个: 2 的平方 4 ,10 进制表示为 4,是回文数;
3 的平方 9,2 进制表示为 1001,是回文数;
9046 的平方 81830116,16 进制表示为 4E0A0E4,是回文数。
小X觉得要全列出来太难了,希望你帮帮他。
输入
第一行包含用一个空格隔开的两个整数 N,M。
输出
第一行包含一个整数,表示满足要求的整数个数。
样例
输入
2 10
输出
2
解析:使用除法计算,不断除以M,同时使用余数创建两个顺序相反的字符串,最后相等则是回文数。
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, m, sum = 0;
cin >> n >> m;
for(int i = 1; i <= n; i++){
int num = i * i;
string s1, s2;
while(num){
int x = num % m;
num /= m;
if(x <= 9){
char c = x + '0';
s1 = c + s1;
s2 = s2 + c;
}
else{
char c = x + 'A';
s1 = c + s1;
s2 = s2 + c;
}
}
if(s1 == s2)sum++;
}
cout << sum;
return 0;
}
1415. 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
解析: 使用除法计算,不断除以D,使用余数结果查找提前准备好的字符串,将查询结果加入到字符串中,最后在倒序遍历即可。
#include <bits/stdc++.h>
using namespace std;
int main() {
string s = "";
long long n, m;
char a[20] = "0123456789ABCDEF";
cin >> n >> m;
while(n){
s = a[n % m] + s;
n /= m;
}
if(s == "")cout << 0;
else cout << s;
return 0;
}