十六位进制数的转换;纠结了

 #include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#define DEC 10#define HEX 16#define BIN 2#define OCT 8#define MAX 32unsigned long int binToUl(const char *binr){ int i=0,n=strlen(binr)-1; unsigned long int rt=0; for (i = 0; n-i>=0; i++) { if (binr[n-i]=='1') rt+=(unsigned long int)floor(pow(2,i)); } return rt;}unsigned long int getNum(const char *num ,const int type){ unsigned long int number; switch (type) { default: number=-1; case DEC:sscanf(num,"%lu",&number);break; case HEX:sscanf(num,"%lx",&number);break; case OCT:sscanf(num,"%lo",&number);break; case BIN: number=binToUl(num); } return number;}char *toBin(const char *num,const int type){ char *ret=NULL; int i,n,mask; unsigned long int number=getNum(num,type); n=(int)floor(log(number)/log(2))+1; mask= 1<<n; ret=malloc(sizeof(char)*(n+1)); for (i = 0; i<=n; i++) { ret[i]= (number&mask)?'1':'0'; number<<=1; } ret[n+1]=0; return ret;}char *toHex(const char *num,const int type){ unsigned long int number=getNum(num,type); char *rt=malloc(sizeof(char)*((int)floor(log(number)/log(16))+1)); sprintf(rt,"%X",number); return rt;}char *toOct(const char *num,const int type){ unsigned long int number=getNum(num,type); char *rt=malloc(sizeof(char)*((int)floor(log(number)/log(8))+1)); sprintf(rt,"%o",number); return rt;}void change(const char *num,const int type){ switch (type) { default: fprintf(stderr,"ERROR,type %d is not defined!",type); case DEC: printf("DEC:%s\nBIN:%s\nHEX:%s\nOCT:%s\n",num,toBin(num,type),toHex(num,type),toOct(num,type)); break; case HEX: printf("DEC:%ul\nBIN:%s\nHEX:%s\nOCT:%s\n",getNum(num,type),toBin(num,type),num,toOct(num,type)); break; case BIN: printf("DEC:%ul\nBIN:%s\nHEX:%s\nOCT:%s\n",getNum(num,type),num,toHex(num,type),toOct(num,type)); break; case OCT: printf("DEC:%ul\nBIN:%s\nHEX:%s\nOCT:%s\n",getNum(num,type),toBin(num,type),toHex(num,type),num); }}int main(void){ char num[MAX]; int type; scanf("%79s",num);/*输入原数字,无符号整数形式*/ scanf("%d",&type);/*输入原数字的进制,10表示十进制,16表示十六进制,8表示八进制,2表示二进制,可以在程序开始处的宏定义中修改*/ change(num,type); /*转换并输出*/ return 0;}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值