C/C++编程学习 - 第10周 ④ 进制转换

题目链接

题目描述

输入一个十进制数N,将它转换成R进制数输出。

Input
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。

Output
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。

Sample Input

7 2
23 12
-4 3

Sample Output

111
1B
-11

思路

将十进制数N,转换成R进制数,输出。这里我写了一个进制转换函数,当然解这道题的方法有很多,不一定要用我这个方法。

C++代码1(进制转换函数模板):

#include<bits/stdc++.h>
using namespace std;
char num[100];
char s[36] = {
    
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
int n, m, step;
void solve(int a, int b)		//十进制数a转化为b进制数 
{
    
    
	step = 0;
	if(a < 0)
	{
    
    
		cout << "-";
		a = -a;
	}
	while(a)
	{
    
    
		num[step++] = s[a % b];
		a /= b;
	}
	for(step -= 1; step >= 0; step--)
		cout << num[step];
	cout << endl;
}
int main ()
{
    
    
    while(cin >> n >> m)	//十进制数n转化为m进制数 
		solve(n, m);
    return 0;
}

当然你也可以这样写:

#include<bits/stdc++.h>
using namespace std;
char num[10005];
int main()
{
    
    
	ios::sync_with_stdio(false);
	long long int n, r;
	while(cin >> n >> r)
	{
    
    
		memset(num, 0, sizeof(num));
		int i = 0, m, flag = 0;
		if(n < 0)
		{
    
    
			flag = 1;
			n = -n;
		}
		while(n >= r)
		{
    
    
			m = n % r;
			if(m < 10) num[i++] = m + 48;
			else if(m == 10) num[i++] = 'A';
			else if(m == 11) num[i++] = 'B';
			else if(m == 12) num[i++] = 'C';
			else if(m == 13) num[i++] = 'D';
			else if(m == 14) num[i++] = 'E';
			else if(m == 15) num[i++] = 'F';
			n /= r;
		}
		if(0 < n && n < 10) num[i++] = n + 48;
		else if(n == 10) num[i++] = 'A';
		else if(n == 11) num[i++] = 'B';
		else if(n == 12) num[i++] = 'C';
		else if(n == 13) num[i++] = 'D';
		else if(n == 14) num[i++] = 'E';
		else if(n == 15) num[i++] = 'F';
		i--;
		if(flag) cout << "-";
		for(; i >= 0; i--)
			cout << num[i];
		cout << endl;
	}
	return 0;
}

也可以这样写:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
	char s1[] = "0123456789ABCDEF", s2[100]; //最大为十六进制,所以只需到F就可以了
	int t, r;
	while(cin >> t >> r)
	{
    
    
		int flag = 0,x;
		if(t < 0)
		{
    
    
			t = -t; //判断是否是负数
			flag = 1;//标记
		}
		for(int i = 0; ; i++)
		{
    
    
			if(t == 0) break;
			s2[i] = s1[t % r]; //求余数并赋值s2,一直循环,直到t=0
			t /= r;
			x = i; //记录一下字符串的长度
		}
		if(flag == 1) cout << '-';
		for(int i = x; i >= 0; i--)
			cout << s2[i]; //逆序输出
		cout << "\n";
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44826711/article/details/113098191