进制转换(十转R)(1108. 正整数N转换成一个二进制数、1289. 正整数n转换为16进制、1288. 正整数n转换为8进制、1547. 小X转进制、1415. 10进制转D进制)

题单地址:​​​​​​题单中心-东方博宜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;	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值