数制转换
一、问题描述:
给定一个M进制的数x,实现对x向任意的一个非M进制的数的转换
二、问题分析:
掌握不同数制间的转换关系是解决问题的关键,这里所说的数制一般包括二进制、八进制、十六进制及十进制。除了不同的数制还有下面几个必须要了解的概念。基数:在一种数制中,只能使用一组固定的数字来表示数的大小。这组固定的数字的个数就称为该计数制的基数(Base)。如十进制的基数为10,二进制的基数为2等。权:又称为位权或权值,即每一个数位都有一个固定的基值与之相对应,称之为权。如十进制的个位对应的权值为 1(10,十位对应的权值为 10(10),百位对应的权值为100(102),对于一个 M 进制的数来说,小数点左边各位上对应的权值从右到左分别为基数的0次方、基数的1次方、基数的2 次方等,对于小数点右边各位上对应的权值从左到
右分别为基数的-1 次方、基数的-2 次方等。二进制、八进制、十六进制向十进制转换:按权展开相加。十进制转换成二进制、八进制、十六进制:整数部分除以基数取余数(取余的方向为从后向前);小数部分乘以基数取整数(取整的方向为从前向后)。二进制、八进制、十六进制相互转换:先转换成十进制再转换成其他进制:或者按照其对应关系进行转换(三位二进制数对应一位八进制数,四位二进制数对应一位十六进制数)。本题按照前一种转换方式进行编程。
三、代码实现
#include<stdio.h> #define MAXCHAR 101 int char_to_num(char ch); char num_to_char(int num); long source_to_decimal(char temp[],int source); int decimal_to_object(char temp[],long decimal_num,int object); void output(char temp[],int length); int main() { int source; int object; int length; long decimal_num; char temp[MAXCHAR]; int flag=1; while(flag) { printf("转换前的数是:"); scanf("%s",&temp); printf("转换前的数制为:"); scanf("%d",&source); printf("转换后的数制为:"); scanf("%d",&object); printf("转换后的数是:"); decimal_num=source_to_decimal(temp,source); length=decimal_to_object(temp,decimal_num,object); output(temp,length); printf("继续请输入1,否则请输入0:\n"); scanf("%d",&flag); } } int char_to_num(char ch) { if(ch>='0'&&ch<='9') return ch-'0'; else return ch-'A'+10; } char num_to_char(int num) { if(num<=9&&num>=0) return (char)('0'+num-0); else return (char)('A'+num-10); } long source_to_decimal(char temp[],int source) { long decimal_num=0; int length; int i; for(i=0;temp[i]!='\0';i++); length=i; for(i=0;i<=length-1;i++) decimal_num=(decimal_num*source)+char_to_num(temp[i]); return decimal_num; } int decimal_to_object(char temp[],long decimal_num,int object) { int i=0; while(decimal_num) { temp[i]=num_to_char(decimal_num%object); decimal_num=decimal_num/object; i++; } temp[i]='\0'; return i; } void output(char temp[],int length) { int i; for(i=length-1;i>=0;i--) printf("%c",temp[i]); printf("\n"); }