数制转换

来源:互联网 发布:通用编程器报价 编辑:程序博客网 时间:2024/06/08 18:20

计算机内部运行是二进制,而程序设计通常为十进制;

数的进制转换一般在2~16进制之间相互转换,可以进行整数转换,也可以进行小数转换;


十进制转换p进制

试把一个十进制数(可带小数)转换为一般的p(2~16)进制数;

1.说明:

首先把输入的十进制数n分解为整数部分n1与小数部分n2;

(1)、整数转换

十进制整数n1转换为p进制整数,实施反复地“除p取余”,直到商为0时停止;

注意到第一个余数为末位数,即输出结果时第一个余数最后打印输出,因此必须设置数组,把每次试商的余数c赋值给s[m];

(2)、小数转化

十进制小数n2转换为p进制小数,实施反复地“乘p取整”,直到小数部分为0或转换的位数达到指定的位数t位时停止,每次把乘p取整的整数c赋值给s[m];

注意:

输出结果与十进制整数转换相反,第一位取整整数即为小数点后第一位,即第一个打印输出,第t位取整整数最后一个打印输出。

(3)、注意特殊输入

有时输入的十进制数可能为纯整数,也可能为纯小数;

  • 当n1!=0时,即存在整数部分,进行整数转换与输出;否则,即为纯小数,可省去整数部分的转换与输出

  • 当n2>2时,即存在小数部分,进行小数转换与输出;否则,即为纯整数,可省去小数部分的转换与输出

(4)、输出字符

注意到当p>10时有“A”“B”等字符输出,在输出时分别有以下两种情形:

  • 1)、当s[k]<=9时,直接输出s[k]即可

  • 2)、当s[k]>9时,输出相应s[k]+55的字符,即当s[k]=10时输出字符“A”,……,当s[k]=15时输出字符“F”

2.程序设计:

#include<stdio.h>#include<math.h>int main(){   double n,n1,n2;   int c,m,k,p,t,s[100];   m=0;   printf("请输入十进制数n:");   scanf("%lf",&n);   printf("请输入转换数制p(2~16,p!=10):");   scanf("%d",&p);   n1=floor(n);   n2=n-n1;   if(n2>0)   {      printf("请确定最多转换小数的位数t:");      scanf("%d",&t);      printf("%lf=(",n);   }   else      printf("%.0f=(",n);     /*实施整数部分转换*/   while(n1!=0)   {      c=fmod(n1,p);      n1=floor(n1/p);      m++;      s[m]=c;          /*整数转换实施除p取余*/   }   for(k=m;k>=1;k--)      /*从后往前逐位输出转换后的整数*/      if(s[k]>9)         printf("%c",s[k]+55);   /*数字超过9时打印A、B等相应字母*/      else         printf("%d",s[k]);   if(n2>0)             /*实施小数部分转换*/   {      printf(".");            /*输出小数点*/      m=0;      while(n2!=0 && m<t)      {         n2=n2*p;         c=(int)n2;         n2=n2-c;         m++;         s[m]=c;              /*小数转换实施乘P取整*/      }      for(k=1;k<=m;k++)       /*从前往后逐位打印输出小数*/         if(s[k]>9)            printf("%c",s[k]+55);         else            printf("%d",s[k]);   }   printf(")%d\n",p);}

3.程序运行示例及其注意事项:

请输入十进制数n:120304,5067请输入转换数制p(2~16,p!=10):16请确定最多转换小数的位数t:8120304.506700=(1D5F0.81B71758)16请输入十进制数n:9876543212345请输入转换数制p(2~16,p!=10):169876543212345=(8FB8FD98B39)16

q进制转换p进制

一般地,把指定的q进制整数转换为p进制整数,这里2<=q,p>=16;

1.说明:

为操作方便,输入q进制整数s改用字符串方式输入,并用“n=strlen(s);”测量字符串的长度,即输入整数的位数;

(1)、q进制整数转换为十进制整数

设置字符串数组s,以输入字符串方式输入q进制整数;

把q进制整数的每一个字符s[j](j=0,1,……,n-1)转换为数值b:

  • 若s[j]<=57时,s[j]为数字字符,则b=s[j]-48

  • 若s[j]>57时,s[j]为字母字符,则b=s[j]-55

从个位开始,各位数值通过分别乘1,q,q^2,……并相加得转换的十进制整数m;

(2)、十进制整数转换为p进制整数

十进制整数m转换为p进制整数,实施反复地除p取余,直到商为0时才停止,把每次试商的余数c赋值给数组元素a[k];

最后输出a[j](j=k,k-1,……,1),当a[j]>9时,输出相应a[j]+55的相应字符;

2.程序设计:

#include<stdio.h>#include<string.h>int main(){   long m,t;   int b,c,n,j,k,p,q,a[100];   char s[20];   printf("请输入q,p(2~16):");   scanf("%d,%d",&q,&p);   printf("请输入%d进制整数:",q);   scanf("%s",s);   printf("(%s)%d=(",s,q);   n=strlen(s);   k=0;   for(m=0,t=1,j=n-1;j>=0;j--)   /*把输入的q进制整数转化为十进制整数s*/   {      if(s[j]<=57)         b=s[j]-48;      else         b=s[j]-55;      m=m+b*t;      t=t*q;   }   k=0;   while(m>0)   {      c=m%p;      m=m/p;      k++;      a[k]=c;         /*实施除p取余m转化为p进制*/   }   for(j=k;j>=1;j--)      if(a[j]>9)         printf("%c",a[j]+55);    /*每一位超过9时打印A,B等相应字母*/      else         printf("%d",a[j]);   printf(")%d\n",p);}

3.程序运行示例及其注意事项:

请输入q,p(2~16):8,16请输入8进制整数:1241640357(1241640357)8=(A8740EF)16

变通:请进一步拓广,把一个带小数的q进制数转换为p进制数

1 0