我的思路:先将给出的数字转换成十进制 再由十进制转换为其他进制
1>将n进制转换成十进制的方法:
将这个数字进行拆分 从最后一位开始 乘以n的x次方(x从零开始 每一次加1)然后对最后的数字进行求和 如图例
eg:现有二进制数1011
拆分成四个数 1,0,1,1
从最后一位开始 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3
所得十进制数为11
2>将十进制转换成n进制的方法:
除商倒序取余法 将该数不断除以n,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制,故此法叫做除商逆序取余法
eg:现有十进制数19 需将其转换成二进制
1 19/2=9……1
2 9/2 =4……1
3 4/2 =2……0
4 2/2 =1……0
5 1/2 =0……1
余数倒序故所得二进制数为10011
#include <stdio.h>
#include <ctype.h>//使用isdigit函数需要的头文件
int main () {
int i;
int n;//待转换数字的进制n
char a[30];//n进制数 不使用& 如果使用则默认a为a[0] 注意使用换行 否则无法输入下一个值
//经测试数组a的数据类型不可以是int 当a是int时 结果会大的离谱
int m;//需要转化的进制
scanf("%d%s\n%d", &n, a, &m);
int b[30];//如果a需要转换成数字,则b用来存放数字
for(i = 0; a[i]; i ++ )
if(isdigit(a[i]))//isdigit是判断是不是字符型数组的函数
b[i] = a[i] - '0';//根据ascii表将字符数字转换成数字
else//是字母
b[i] = (a[i] - 'A') + 10;//根据ascii表将字符转换成数,记得 + 10
int len1 = i;//i出来之后就是长度
//转换成十进制
int time=1;//n的零次方是1
int sum=0;//sum是换成十进制后的数
for(i = len1 - 1; i >= 0; i -- )
{
sum += b[i] * time;//乘以每一位十进制的值是多少
time *= n;//n的几次方
}
//转换成m进制
int c[30];//转换成m进制后依次存放
int len2 = 0;//倒序输出的标志
while(sum >= 1)
{
c[len2] = sum % m;
sum /= m;
len2 ++ ;
}
for(int i = len2 - 1; i >= 0; i -- )//倒着输出
if(c[i] < 10) printf("%d", c[i]);//是数字
else printf("%c", c[i] - 10 + 'A');//是字母
return 0;
}
11.2