最近在为蓝桥杯做准备,碰巧看到进制转换题,就把所学的汇总了一下,加上自己的见解,希望对大家有帮助。
注:若需要输入二进制等其他进制数请先转化成十进制或利用输入格式如%o进行输入
附输出格式:
输出十进制:%d;
输出八进制;%o;
输出十六进制:%x;
输出单个字符:%c;
输出字符串:%s;
输出变量所在的地址:%p;
附其他进制转十进制代码:
#include <stdio.h>
int main(){
int x,p; //x输入数字 p该数的进制数
scanf("%d",&x);
scanf("%d",&p);
int y=0,product=1;
while(x!=0){
y=y+(x%10)*product;
x=x/10;
product=product*p;
}
printf("%d",y);
return 0;
}
例:将十进制正整数转化为八进制
思路一:利用输出类型%o直接输出
参考代码:
#include <stdio.h>
int ChangeBase(){//个人习惯写单独函数在main中调用
int n=0;
scanf("%d",&n);//例:输入10
printf("%o",n);//例:输出12
return 0;
}
int main() {
return ChangeBase();
}
思路二:利用短除法。
具体思路:
从低位到高位计算数值同时通过取余和整除的优越性更新处理正整数,利用规律。
如:29十进制转8进制,对8取余得5保存a[0]为5,29整除8得3更新n为3,3对8取余得3保存a[1]为3,对8整除得0更新n为0,n=0时循环结束。逆向输出保存的数组为35.
注意事项:题目给定正整数所以没有考虑0和余数情况
参考代码:以十进制转8进制为例
#include <stdio.h>
#include <malloc.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
#include <complex.h>
#include <stdlib.h>
int ChangeBase(){//个人习惯写单独函数在main中调用
int n=0;//如果需要其他进制转换请用注解中的m替换8
//int m=0;
scanf("%d",&n);//例输入29
//scanf("%d",&m);
int flag=0;
int a[100]={0};//从低位到高位存放数据
while (n!=0){
a[flag++]=n%8;//flag先计算再自增,从低位到高位计算数据
n/=8;//更新n
// a[flag++]=n%m;
// n/=m;
}
for (int i = flag-1; i > -1; --i) {
printf("%d",a[i]);//从高到低输出例:35
}
return 0;
}
int main() {
return ChangeBase();
}
思路三:利用头文件stdlib.h中的itoa函数进行整型和字符串转换
具体用法:itoa函数(整型,字符串,转换进制)
注意事项:只能用整型作为转换对象,若要用无符号整数等类型可以参考使用
且需要引用<stdlib.h>头文件
itoa() 将整型值转换为字符串
litoa() 将长整型值转换为字符串
ultoa() 将无符号长整型值转换为字符串
参考代码:
#include <stdio.h>
#include <stdlib.h>
int ChangeBase(){
int n=0;
scanf("%d",&n);
char string[33]={'\0'};//最大32位故用33位数组储存并初始化数组
itoa(n,string,8);
puts(string);
return 0;
}
int main() {
return ChangeBase();
}
参考文章: