用C语言,如何写十进制转换十六进制的程序,要注意十六进制有ABCDEF。

时间:2022-01-10 00:57:49

主题:用C语言,如何写十进制转换十六进制的程序
作者:meiyoudao      发表时间:2006-9-6 17:39:00

楼主  

用C语言,如何写十进制转换十六进制的程序,要注意十六进制有ABCDEF。

 

作者:argentmoon      发表时间:2006-9-6 18:09:00

 1楼  

只是输出的话%X...
保存起来的话就模16去做好了

 

作者:阿斯兰      发表时间:2006-9-6 20:29:00

 2楼  

取余后得的数如果>=10 转换成ABC....字母

 

作者:hitsoft      发表时间:2006-9-6 21:35:00

 3楼  

我没事写了个,你看看,
对于小的数字,这个程序根本就不用想,
所以我写了个大数字转换成16进制的:
#include "Stdio.h"
#include "Conio.h"
char result[100];
int pos;
void change(int *num);
int main(void)
{
  char str[100];
  int num[100];
  int bin[300]={0};
  int quot[100],residue=0;
  int i,j,k=0,suffix=0,index=0;
  puts("Input a decimal number:");
  gets(str);
  for(i=0;i<strlen(str);num[i]=str[i]-48,i++);
  j=i-1;
  while(j>=0)
    {
       num[j]%2?(bin[k++]=1):(bin[k++]=0);
       while(index<=j)
       {
          residue+=num[index];
          if(residue>=2)
            quot[suffix++]=residue/2;
          else if(index)
            quot[suffix++]=0;
          residue=(num[index]%2)*10;
          index++;
       }
       for(i=0;i<suffix;num[i]=quot[i],i++);
       j=suffix-1;
       residue=suffix=index=0;
    }
  for(i=0;i<k;change(bin+i),i+=4);
  for(i=pos-1;i>=0;printf("%c",result[i]),i--);
  getch();
  return 0;
}
void change(int *num)
{
   if(num[3]==0&&num[2]==0&&num[1]==0&&num[0]==0)
     sprintf(result+pos,"%c",'0');
   if(num[3]==0&&num[2]==0&&num[1]==0&&num[0]==1)
     sprintf(result+pos,"%c",'1');
   if(num[3]==0&&num[2]==0&&num[1]==1&&num[0]==0)
     sprintf(result+pos,"%c",'2');
   if(num[3]==0&&num[2]==0&&num[1]==1&&num[0]==1)
     sprintf(result+pos,"%c",'3');
   if(num[3]==0&&num[2]==1&&num[1]==0&&num[0]==0)
     sprintf(result+pos,"%c",'4');
   if(num[3]==0&&num[2]==1&&num[1]==0&&num[0]==1)
     sprintf(result+pos,"%c",'5');
   if(num[3]==0&&num[2]==1&&num[1]==1&&num[0]==0)
     sprintf(result+pos,"%c",'6');
   if(num[3]==0&&num[2]==1&&num[1]==1&&num[0]==1)
     sprintf(result+pos,"%c",'7');
   if(num[3]==1&&num[2]==0&&num[1]==0&&num[0]==0)
     sprintf(result+pos,"%c",'8');
   if(num[3]==1&&num[2]==0&&num[1]==0&&num[0]==1)
     sprintf(result+pos,"%c",'9');
   if(num[3]==1&&num[2]==0&&num[1]==1&&num[0]==0)
     sprintf(result+pos,"%c",'A');
   if(num[3]==1&&num[2]==0&&num[1]==1&&num[0]==1)
     sprintf(result+pos,"%c",'B');
   if(num[3]==1&&num[2]==1&&num[1]==0&&num[0]==0)
     sprintf(result+pos,"%c",'C');
   if(num[3]==1&&num[2]==1&&num[1]==0&&num[0]==1)
     sprintf(result+pos,"%c",'D');
   if(num[3]==1&&num[2]==1&&num[1]==1&&num[0]==0)
     sprintf(result+pos,"%c",'E');
   if(num[3]==1&&num[2]==1&&num[1]==1&&num[0]==1)
     sprintf(result+pos,"%c",'F');
   pos++;
}

 

作者:阿斯兰      发表时间:2006-9-6 22:50:00

 4楼  

好吧 我也写一个

#include <stdio.h>
#include <stdlib.h>

void Conversion(int num,int a[],int &i)
{
  do
    { a[i]=num%16;
      num=num/16;
      i++;
    }while (num);
  i--;
}

int main()
{
  int num,a[100],i=0;
  printf("输入想要转换的10进制数:");
  scanf("%d",&num);
  printf("/n转换成16进制数后是:");
  Conversion(num,a,i);
  for (int n=i;n>=0;n--)
    { if (a[n]>=10)
        { a[n]+=55;
          printf("%c",a[n]);
         }
      else
       { printf("%d",a[n]);
       }
    }
  printf("/n");
  return 0;
}

 

作者:o奔3o      发表时间:2006-9-7 13:28:00

 5楼  

我也写一个
#include "stdio.h"
main()
{
    int i;
    printf("please input a number:/n");
    scanf("%d", &i);
    printf("i=%xH", i);
    return 0;
}

 

作者:ANSIC      发表时间:2006-9-7 14:12:00

 6楼  

呵呵,一个比一个牛

 

作者:zhoufengug      发表时间:2006-9-7 15:54:00

 7楼  

3楼太复杂!!!
当大于10就直接+上一个固定的值,然后再以char输出不就可以实现ABCDEF拉

 

作者:argentmoon      发表时间:2006-9-7 17:19:00

 8楼  

7楼的大概没有理解3楼的意思,他指的“大整数”超出int,long范围的。

 

作者:anywlwdwlbsm      发表时间:2006-9-8 12:49:00

 9楼  


能请阿斯兰帮我解释一下你写的这个函数:
void Conversion(int num,int a[],int &i)
{
  do
    { a[i]=num%16;
      num=num/16;
      i++;
    }while (num);
  i--;
}
的执行过程吗?特别是中间的i++;和i--的作用.谢谢!

 

作者:renlin1987      发表时间:2006-9-8 14:49:00

 10楼  

27088843程序员之家QQ群请大家加入,一起交流~~~~~~~~~~~~~~~~~~

 

作者:kgdiawpyu      发表时间:2006-9-8 18:44:00

 11楼  

严的数据结构与算法中有这个题目的算法
用递归!

 

作者:阿斯兰      发表时间:2006-9-8 19:13:00

 12楼  

to 9楼 

不就是经典的10进制转换成16进制的方法吗  对16取余啊 
i++ 是为了把得到的数放到a[0] a[1] ...里  
最后一个i-- 是因为 当num==0时 循环要退出了 可还i++了一下 所以就i-- 回去一下咯

还有 我那程序 这里不太好 把数组a的值改了
if (a[n]>=10)
        { a[n]+=55;
          printf("%c",a[n]);
         }

改成这样会好点
if (a[n]>=10)
        { int temp=a[n]+55;
          printf("%c",temp);
         }
这样就不改变数组a的值了 以后还可以再用

 

作者:overfly      发表时间:2006-9-8 19:43:00

 13楼  

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
    char result[9];
    int number,step=0;
    printf("please input the number:");
    scanf("%d",&number);
    do
    {
      result[step]="0123456789ABCDEF"[number%16];
      number/=16;
      step++;
    }while(number!=0);
    result[step]='/0';
    printf("the result is:%s/n",strrev(result));
    system("pause");
    return 0;
}

 

作者:forjane      发表时间:2006-9-8 22:49:00

 14楼  

10进制转换成2,8,16进制最快得方法不是整除,求模,而是按位与和移位操作,实际上内存里早就放好了结果,直接拿出来就可以了
num=abs(num);
for(i=28;i>=0;i-=4)
{
    *a++=(num>>i)&15;
}

 

作者:argentmoon      发表时间:2006-9-8 23:07:00

 15楼  

真要这么说的话。。直接调用系统函数吧。。
char s[N];
sprintf(s, "%X", n);

 

作者:lby318      发表时间:2007-7-13 16:27:00

 16楼  


看这个合你意不?
#include<stdio.h>
void main()
{char b[]="0123456789ABCDEF";
long int n,x;
int i,a[40];
printf("/n Please input n=");
scanf("%ld",&n);
x=n;i=0;
while(x>0)
{a[i]=x%16;
 x=x/16;
 i++;
}
while(i>0)
{printf("%c",b[a[i-1]]);
 i--;
}
printf("/n");
}

 

作者:getchar      发表时间:2007-8-30 9:47:00

 17楼  

十进制转换十六进制有谁能告诉我下用switch写啊?用C语言,如何写十进制转换十六进制的程序,要注意十六进制有ABCDEF。

 

作者:xklee_world      发表时间:2007-8-30 10:39:00

 18楼  

先给个程序,然后再说其他的,呵呵

#include <stdio.h>

int main(void)
{
  int a;
  char s[100];

  //input you want
  scanf("%d" , &a);
  
  sprintf(s , "%#x" , a);
  
  printf("%s/n" , s);
 
  system("pause");
  return 0;
}

 

作者:xklee_world      发表时间:2007-8-30 10:40:00

 19楼  

先给个程序你看下,然后再说其他的,哈哈

#include <stdio.h>

int main(void)
{
  int a;
  char s[100];

  //input a number you want
  scanf("%d" , &a);
  
  sprintf(s , "%#x" , a);
  
  printf("%s/n" , s);
 
  system("pause");
  return 0;
}

 

作者:xklee_world      发表时间:2007-8-30 10:52:00

 20楼  

现在说下原理,不一定对哈,

好比是有一个十进制的数 123456 , 他在内存里是以二进制表示的,当你用%d,输出的时候
,他是自动的将二进制换成了10进制,同样,你用%x输出的话,他也是自动的将二进制
转换成十六进制来表示。

然后再来说下计算,同样是这个数,不管你是用十六进制的表现形式,十进制的表现形式,
等等来计算,实际上,他都是在内部以二进制来计算的,所以你不必太在意数字的外在表现
形式。

这就好比是一个人,他办事的时候是不能穿衣服的,那他出去混的时候总不能不穿衣服吧,呵呵

如果你是为了锻炼自己的思维而问这个问题的话,那就告诉你一个比较快的方法,
先用位操作,将其转换成二进制的表现形式,然后,用个对照表,将其每四位每四位
转换成相应的十六进制,呵呵,就是这样的

 

作者:xklee_world      发表时间:2007-8-30 10:54:00

 21楼  

看在我是新人的份上给个分吧,谢谢

 

作者:lingang1      发表时间:2007-9-1 3:42:00

 22楼  

如果数字不大的话,直接用printf()的格式来
输出就行了。