问题描述
将一个十进制数X(1<=X<=10^9)转换成任意进制数M(2<=M<=16)。
输入
一行两个正整数X和M。
输出
输出X的M进制的表示。
输入样例
31 16
输出样例
1F
思路:
十进制与二进制的相互转换:十进制与二进制相互转换详解
类似于十进制数转换为二进制数的方法,十进制数转换为R进制数的基本方法是:对于整数采用“除R取余”,对于小数采用“乘R取整”。具体做法为:对于十进制数整数,用R连续除要转换的十进制整数及各次所得之商,直除到商等于0时为止,则各次所得之余数即为所求R进制整数由低位到高位的值;对于十进制小数,用R连续乘要转换的十进制小数及各次所得之积的小数部分,直乘到积的小数部分为0(或满足所要求的精度)时为止,则各次所得之积的整数部分即为所求R进制小数由高位到低位的值。当十进制数包含有整数和小数两部分时,可分别将整数和小数转换,然后相加。
直接采用“除M取余”的方法将十进制整数X转换为M进制数。
注:
小tip:因为十六进制中有2-16进制都需要用到数,故先采取一个字符型数组a在0-15的位置中存储0123456789ABCDEF十六进制的所有数。在转化成M进制时,X%M为此字符型数组对应的序号。如:15转化成11进制:
a[15%11]=a[4]=4 ; 15/11=1; a[1%11]=a[1]=1;
答案为14
#include <iostream>
#include <string>
using namespace std;
//思路:直接采用“除M取余”的方法将十进制整数X转换为M进制数。
//考虑到11-16进制特殊
//故先把2~16进制能用到的数先存储到一个字符型数组中
char table[20]="0123456789ABCDEF";//(无论如何数组都要开大些)
int main(int argc, char** argv) {
int x,m;
cin>>x>>m;
//x为10进制数,m为要转为的进制数
//因为10进制之后有英文字母,故建立字符型数组存储结果
char a[35]; //最高位为32位
int len=0;//记录数组长度
while(x)
{
a[len++]=table[x%m];//在不同进制中对应的余数为字符型数组的序号
x/=m;
}
for(int i=len-1;i>=0;i--)//逆序输出数组即可(因为存储时,a[0]为低位)
cout<<a[i];
return 0;
}
如果喜欢的话,点个赞再走吧。