一、十六进制间的任意转换:
我主要的思路分两个步骤:
1、把x进制数转换成十进制数
2、再把该十进制数转换成我们需要得到的m进制数
二、代码(func.c、func.h、main.c)
1、func.c
#include "func.h"
/*十进制转m进制*/
int decim(int n, int m, int buf[])
{
int s;
bzero(buf, sizeof(buf));
s=0;
while(n>=m){
buf[s++] = (n - (n/m)*m);
n /= m;
}
buf[s]=n;
return s+1;
}
/*m进制转十进制*/
int C_decim(char n[], int m)
{
int i,j,len,s,flag,num;
s=0;
flag=0;
len=strlen(n);
for(i=len-1; i>=0; i--){
num = 1;
for(j=0; j<flag; j++){
num *= m;
}
if((n[i] >= '0') && (n[i] <= '9')){
s += ((n[i]-'0')*num);
}else if((n[i] >= 'a') && (n[i] <= 'f')){
s += ((n[i]-'a'+10)*num);
}else if((n[i] >= 'A') && (n[i] <= 'F')){
s += ((n[i]-'A'+10)*num);
}
flag++;
}
return s;
}
char str1[16]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
char str2[16]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
/*判断数据的正确与否*/
int judge(int x, int m, char n[])
{
int i,len;
if(x<2 || m<2 || x>16 ||m>16){
return -1;
}
len=strlen(n);
for(i=0; i<len; i++){
if(m > 9){
if('0' > n[i] || n[i] > ('a'+m-10) || (n[i] > '9' && n[i] < 'A') || \
(n[i] > ('A'+m-10)&&(n[i] < 'a'))){
return -1;
}
}else{
if('0' > n[i] || ('0'+m) <= n[i] ){
return -1;
}
}
}
return 0;
}
2、func.h
#include <stdio.h>
#include <string.h>
/*十进制转m进制*/
int decim(int , int , int *);
/*m进制转十进制*/
int C_decim(char * , int );
int judge(int , int , char *);
3、main.c
#include "func.h"
char str[16]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
int main(void)
{
int i ,temp ,k ,x ,m ,buf[64];
char n[64];
while(1){
bzero(n, sizeof(n));
printf("\n十六进制间的任意转换(USAGE:x n m)\nx:输入的为几进制数;n:输入的数;m:将要转换成几进制数\n>>>>>>输入小于2的数退出<<<<<<\n");
scanf("%d", &x);
if(x < 2){
return 0;
}
scanf("%s", n);
scanf("%d", &m);
/*判断输入数据的正确与否*/
if(-1 == judge(x, m, n)){
printf("input error!\n");
continue;
}
/*转换成十进制*/
temp=C_decim(n, x);
/*转换成需要的进制*/
k=decim(temp, m, buf);
printf("%d进制数%s转换成%d进制数的结果: ", x, n, m);
for(i=k-1; i>=0; i--){
printf("%c", str[buf[i]]);
}
printf("\n\n");
}
return 0;
}