数制转换
来源:互联网 发布:通用编程器报价 编辑:程序博客网 时间: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进制数;
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 数制转换
- 简单树链剖分
- java--类加载相关知识点
- 装饰与继承的区别
- mysql分表的3种方法
- Box2d中刚体的纹理的几种实现方式
- 数制转换
- openstack配置项自动生成方法
- 【codeforces 750F】New Year and Finding Roots
- update优先级设置
- Android实现Canny算法
- 未能加载文件或程序集 Microsoft.ReportViewer.Common, Version=11.0.0.0
- R语言实战笔记--第十章 功效分析&样本量
- leetcode389
- VB.Net未能加载文件或程序集“XXX”或它的某一个依赖项。