计算机内部运行是二进制,而程序设计通常为十进制;
数的进制转换一般在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进制数;