进制转换问题

注意:AC代码在最后,需要自取

题目描述
请你编一程序实现两种不同进制之间的数据转换。

输入格式
共三行,第一行是一个正整数,表示需要转换的数的进制 (2≤n≤16),第二行是一个 n 进制数,若 n>10 则用大写字母 A∼F 表示数码 10∼15,并且该 n 进制数对应的十进制的值不超过 10的九次方 ,第三行也是一个正整数,表示转换之后的数的进制 m (2≤m≤16)。

输出格式
一个正整数,表示转换之后的 m 进制数。

输入输出样例
输入 #1
16
FF
2
输出 #1
11111111

题目分析

这道题就是最基础的进制转换,我的思路是先把n进制数转换为10进制数,再把这个10进制数转换为m进制数。

 例如,16进制的FF先转换为10进制的255,再转换为2进制的11111111。

思路

首先我们先写出n进制数转换为10进制的代码:

#include<iostream>
using namespace std;
int main()
{
	int n1,n2,z=0,i,a=1,e;
	string n,g;
	cin>>n1>>n>>n2;
	for(i=n.size()-1;i>=0;i--)//从后往前判断
	{
		if(n[i]>='A'&&n[i]<='F')//判断是否为字母
		{
			z+=(n[i]-'A'+10)*a;//将字符转数字
			a=a*n1;
		}
		else if(n[i]>='0'&&n[i]<='9')//判断是否为数字
		{
			z+=(n[i]-'0')*a;//将字符转数字
			a=a*n1;
		}
	}

这里我用z把十进制的数存下来,一定要注意字母转数字是n[i]-'A'+10,不要忘记加10,或者你也可以写你n[i]-55。

紧接着我们就开始10进制转m进制,我这里用了一个while循环:

    while(z>0)//g,str都是string类型的
	{
		e=z%n2; //这步可以算出转换后每一位上的数
		if(e<10) g='0'+e;//判断是否转换为字母
		else g=e-10+'A';
		str=g+str;//将每次的数字或字母加到字符串中
		z/=n2;//z的值每次要除m
	}
    cout<<str;//输出

可能有人看不懂z为什么要除m(代码中为n2),下面的图可以解释:

 可以看到,10进制转2进制时每此都除了2,后面则有余数(代码中用e存储),因为255(存的10进制数)是int类型,所以除2后只保留整数部分,所以就是z除m。

随后将两部分结合后,轻松AC。

AC代码: 

#include<iostream>
using namespace std;
int main()
{
	int n1,n2,z=0,i,a=1,e;
	string n,g,str;
	cin>>n1>>n>>n2;
	for(i=n.size()-1;i>=0;i--)
	{
		if(n[i]>='A'&&n[i]<='F')
		{
			z+=(n[i]-'A'+10)*a;
			a=a*n1;
		}
		else if(n[i]>='0'&&n[i]<='9')
		{
			z+=(n[i]-'0')*a;
			a=a*n1;
		}
	}
	while(z>0)
	{
		e=z%n2; 
		if(e<10) g='0'+e;
		else g=e-10+'A';
		str=g+str;
		z/=n2;
	}
	cout<<str;
	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值