等一下,给你完整程序。
以下程序经过调试成功,你自己也试试。基本思想是:用字符数组存储10进制数字,先将10进制再转换为2进制,再通过2进制转换为16进制。这里先转换为2进制的原因是进行除2运算要相对容易一些,且2进制转换为16进制以及8进制都是很方便的。当然你也可以直接对16进行整除求余得到结果。
参考程序如下:
#include "stdio.h"
#include "string.h"
#define N 200
#define M 10000
void div(char s1[],char s2[])//s1整除2,商放入s2中
{
int i,j,k,t,yu;
if(s1[0]<'2' && strlen(s1)==1)
{
s2[0]='0';s2[15]=0;
}
else
{
k=strlen(s1); j=0;
yu=(s1[0]-48)%2;
if(s1[0]>'1')s2[j++]=(s1[0]-48)/2+48;
for(i=1;i<k;i++)
{
t=yu*10+s1[i]-48;
if(t<2)
{
s2[j++]='0';
yu=t%2;
}
else
{
s2[j++]=t/2+48;
yu=t%2;
}
}
s2[j]=0;
}
}
void convert2to16(char s2[],char s16[])//将2进制转换为16进制
{
int i,len,t,k,j;
char s[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
len=strlen(s2);
t=0;k=1;j=0;
if(len%4!=0)
{
for(i=len%4-1;i>=0;i--){t+=(s2[i]-48)*k;k=k*2;}
s16[j++]=s[t];
}
for(i=len%4;i<len;i+=4)
{
t=(s2[i]-48)*8+(s2[i+1]-48)*4+(s2[i+2]-48)*2+(s2[i+3]-48)*1;
s16[j++]=s[t];
}
s16[j]=0;
}
void main()
{
char ch,num[N],shang[N],two[M],sixteen[M/4+1];//记录待转换的数据
int i,j,k,Len;
i=0;
printf("请输入数字(<200位):\n");
gets(num);
do{
div(num,shang);
Len=strlen(num);
two[i++]=num[Len-1]%2+48;
strcpy(num,shang);
}while(num[0]!='0');
two[i]=0;
for(j=0,k=i-1;j<k;j++,k--)//将two颠倒,余数从下向上
{
ch=two[j];
two[j]=two[k];
two[k]=ch;
}
convert2to16(two,sixteen);//将二进制转换为16进制
printf("对应的16进制数为:\n");
puts(sixteen);
}
温馨提示:答案为网友推荐,仅供参考