版权声明:转载请注明出处 https://blog.csdn.net/nanhuaibeian/article/details/88172142
1. 基础知识
- 十进制转二进制
方法为:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除依此步骤继续向下运算直到商为0为止。
- 十进制转换为其他的进制同理
- 2进制转换为8进制之类的转换可以借助十进制完成,即先转换为10进制,然后将10进制转换为8进制
可参考
2. 出现的问题
- 本来想借助函数f2实现将a转换为b进制的数,由于大于10的进制含有A代表10,B代表11,C代表12,D代表13,E代表14,F代表15,所以想着把数组f定义为字符串数组,但是问题出现在进制转换借助的余数为整数,需要存储确是字符,将小于10的余数直接赋给c时,打印便会异常,so这种方法行不通。
//进制转换
int f2(int a,int b){ //a代表整数,b代表需要转换的进制
int temp,i=0,d;
char c;
temp = a;
while(temp!=0){
d = temp%b;
if(d>15) {
printf("数据非法!!!");
return 0;
}
switch(d){
case 10: c = 'A';break;
case 11: c = 'B';break;
case 12: c = 'C';break;
case 13: c = 'D';break;
case 14: c = 'E';break;
case 15: c = 'F';break;
default: c =d;printf("%c\n",c);break;//打印异常
}
f[i++] = c;
temp = temp/b;
}
return i;
}
- 解决办法
进制转换函数得到的余数存储在整数数组中,转换函数不作操作,主函数输出打印时加switch语句判断进行处理即可
3. 代码
#include <stdio.h>
#define max 100
int f[max]; //为了使用方便,定义为全局变量
//进制转换函数
int f2(int a,int b){ //a代表整数,b代表需要转换的进制
int temp,i=0,d;
temp = a;
while(temp!=0){
f[i++] = temp%b; ;
temp = temp/b;
}
return i; //将转换后的进制个数返回
}
int main(){
int a,b,n,i;
char c; //用来接收大于9时的字母表示
printf("请输入一个十进制的整数a:");
scanf("%d",&a);
printf("请输入需要将其转化为几进制(2-16):");
scanf("%d",&b);
//调用进制转换函数
n = f2(a,b);
//打印输出转换后的进制
for(i=n-1;i>=0;i--){
switch(f[i]){
case 10: c = 'A';printf("%c ",c);break;
case 11: c = 'B';printf("%c ",c);break;
case 12: c = 'C';printf("%c ",c);break;
case 13: c = 'D';printf("%c ",c);break;
case 14: c = 'E';printf("%c ",c);break;
case 15: c = 'F';printf("%c ",c);break;
default: printf("%d ",f[i]);break;
}
}
return 0;
}
4. 考试版
//将一个无符号十进制整数转换成(2-16)进制数并输出
#include "stdio.h"
void print(int num,int d) {
int a[20];
int n=0,r,i,temp;
r=num;
while(r!=0) {
a[n++]= r%d;
r = r/d;
}
for(i=n-1; i>=0; i--)
switch(a[i]) {
case 10:
printf("A ");
break;
case 11:
printf("B ");
break;
case 12:
printf("C ");
break;
case 13:
printf("D ");
break;
case 14:
printf("E ");
break;
case 15:
printf("F ");
break;
default:
printf("%d ",a[i]);
break;
}
}
void main() {
int num=17,d=16;
// scanf("%d %d",&num,&d);
print(num,d);
}