c语言编程2 8 16进制数,C语言程序:输入一个2/8/10/16进制数,将其转换到2/8/10/16进制数...

满意答案

00e27ab806e4881f8254fe7ae8741834.png

zjnyxz

2015.09.24

00e27ab806e4881f8254fe7ae8741834.png

采纳率:56%    等级:9

已帮助:317人

//---------------------------------------------------------------------------

#include

#include

#include

#include

#define DEC 10

#define HEX 16

#define BIN 2

#define OCT 8

#define MAX 32

unsigned 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<

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

BIN:%s

HEX:%s

OCT:%s

",num,toBin(num,type),toHex(num,type),toOct(num,type));

break;

case HEX:

printf("DEC:%ul

BIN:%s

HEX:%s

OCT:%s

",getNum(num,type),toBin(num,type),num,toOct(num,type));

break;

case BIN:

printf("DEC:%ul

BIN:%s

HEX:%s

OCT:%s

",getNum(num,type),num,toHex(num,type),toOct(num,type));

break;

case OCT:

printf("DEC:%ul

BIN:%s

HEX:%s

OCT:%s

",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;

}

//---------------------------------------------------------------------------

00分享举报

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值