实现十六进制间的任意转换

一、十六进制间的任意转换:

我主要的思路分两个步骤:

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;
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值