输入描述:
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述:
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)
解题思路:
参考自己手动转换的方式。
给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数,我们只需要
用M/N,可以得到一个商和余数;在用商/N,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为N进制数的低位有效位,后得到的余数作为N进制数的高位有效位,依次排列起来。
注:
此题中负数的N进制位 -负数对应正数的N进制位
eg: -20的十六进制为-14.
代码实现:
#include<string>
#include<iostream>
#include<vector>
using namespace std;
void Fun(int& M,int& N,vector<char>& arr)
{
while(M!=0)
{
int flag=M%N;
char c=0;
if(flag>=10)
{
//如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)
//此处为了满足这个条件
c=flag-10+'A';
}
else
{
c=flag+'0';
}
arr.push_back(c);
M=M/N;
}
}
int main()
{
int M,N;
cin>>M>>N;
if(M<0)
{
M=-M;
cout<<"-";//保证负数的N进制
}
string str;
vector<char> arr;//因为求得的余数需要逆序,所以我暂时用数组保存
Fun(M,N,arr);
for(int i=arr.size()-1;i>=0;--i)
{
str+=arr[i];//将刚才求出的结果逆序
}
cout<<str<<endl;
return 0;
}
看到一个大佬写的,我感觉自己太low了,让我们一起看看!
#include<string>
#include <iostream>
using namespace std;
int main(){
string s="",table="0123456789ABCDEF";//用一个字符串将结果保存起来,也方便以后用下表引用
int m,n;
cin>>m>>n;
if(m==0)
cout<<m<<endl;
while(m){
if(m<0){
m=-m;
cout<<"-";
}
s=table[m%n]+s;//刚求得的结果在前,原来求得的结果在后,不用第三方保存,直接达到目的,很赞
m/=n;
}
cout<<s<<endl;
return 0;
}
注:如果本篇博客有任何错误和建议,欢迎伙伴们留言,你快说句话啊!