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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水蛙菌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值