数制转换

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

数的进制转换一般在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:8
120304.506700=(1D5F0.81B71758)16
请输入十进制数n:9876543212345
请输入转换数制p(2~16,p!=10):16
9876543212345=(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进制数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值