C++实现各个进制之间的转换

进制转换

题目描述

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

输入格式

共三行,第一行是一个正整数,表示需要转换的数的进制 n ( 2 ≤ n ≤ 16 ) n(2≤n≤16) n(2n16),第二行是一个n进制数,若 n > 10 n>10 n>10则用大写字母 A − F A-F AF表示数码 10 − 15 10-15 1015,并且该 n n n进制数对应的十进制的值不超过 1000000000 1000000000 1000000000,第三行也是一个正整数,表示转换之后的数的进制 m ( 2 ≤ m ≤ 16 ) m(2≤m≤16) m(2m16)

输出格式

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

样例 #1

样例输入 #1

16
FF
2

样例输出 #1

11111111

思路

首先想到的是将各个进制的数都转化为10进制。
2进制10进制举例1011转化为10进制就等于 1x23+0x22+1x21+1x20=11;
转化为代码就是:

for(int i=0;i<s.length();i++)//先转化为10进制 
	{
		if(s[i]<'A')
		{
			temp=pow(n,s.length()-i-1);
			temp*=(s[i]-'0');
			sum+=temp;
		}else{
			temp=pow(n,s.length()-i-1);
			temp*=(s[i]-'A'+10);//A在16进制中为10 
			sum+=temp;//sum即为转化完成的10进制数字
		}
	}

接着就是把10进制的数字 转化为各个进制的数字
假如将10进制的数字转化为2进制的数字.
接着用上面的11来
先将11/2得到5余数为1;
然后5/2得到2余数为1;
接着2/2得到1余数为0;
最后1/2得到0余数为1;
我们就可以发现 余数倒过来上去得到的1011就是我们要的答案
这里我用的是将他们存储在一个arr数组中.

while(sum>0)
	{
		arr[cnt++]=sum%m;
		sum/=m;
	}

最后将他们倒序输出就好了
以下是AC代码

#include<bits/stdc++.h>
using namespace std;
int arr[10000000];//用来存储最终答案
int cnt=0;//为最终答案位数计数
int main()
{
	int n,m;//将n进制的数转化为m进制的数 
	string s;//n进制的数
	cin>>n>>s>>m;
	int temp,sum=0;
	for(int i=0;i<s.length();i++)//先转化为10进制 
	{
		if(s[i]<'A')
		{
			temp=pow(n,s.length()-i-1);
			temp*=(s[i]-'0');
			sum+=temp;
		}else{
			temp=pow(n,s.length()-i-1);
			temp*=(s[i]-'A'+10);//A在16进制中为10 
			sum+=temp;
		}
	}
	while(sum>0)
	{
		arr[cnt++]=sum%m;
		sum/=m;
	}
	for(int i=cnt-1;i>=0;i--)
	{
		if(arr[i]>=10)
		{
			printf("%c",arr[i]+'A'-10);
		}else{
			cout<<arr[i];
		}
	}
	return 0;
}

完结~~~~~

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Afunnygamer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值