满意答案
zjnyxz
2015.09.24
采纳率: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分享举报