索引一、算法分析二、数据结构:1、头文件2、栈的关键操作三、关键程序:1、十进制进制转换为其它2、其它进制转换为十进制一、算法分析实现进制转换需要编个函数,每一函数完成相应进制的转换,下面是各个进制之间转换的数学方法的算法。
十进制转二进制:十进制数转换成二进制数,是一个连续除2的过程;把要转换的数,除以2,得到商和余数,将商继续除以2,直到商为0.最后将所有余数倒序排列,得到数就是转换结果。
例如:302/2 = 151 余0151/2 = 75 余175/2 = 37 余137/2 = 18 余118/2 = 9 余09/2 = 4 余14/2 = 2 余02/2 = 1 余0所以302转换为2进制,结果:100101110十进制转八进制:十进制数转换成八进制的方法和转换为二进制的方法类似,唯一变化:除数由2变成8。
例如:120/8=15余015/8=1余71/8=0余1所以120转换为8进制,结果为:170十进制转十六进制:十进制数转换成十六进制数的方法和转换为二进制的方法类似,唯一变化:除数由2变成16。
不过,十六进制数:(10~15)是用英文大写字母(A~F)表示。
例如:123/16=7余11所以123转换为16进制,结果为:7B二进制转十进制:二进制数转换为十进制数按权展开,第0位的权值是2的0次方,第1位的权值是2的1次方〃〃〃〃〃〃例如:1010转换成十进制数:第0位:0*2^0=0第1位:1*2^1=2第2位:0*2^2=0第3位:1*2^3=8所以转换为10进制数为:0+2+0+8=10二进制转八进制:利用421,从后往前每三位一组,缺位除补0,然后按十进制方法进行转换。
例如:(11001)001=1011=3然后将结果按从下往上顶顺序书写:31二进制转十六进制:二进制和十六进制的互相转换比较重要。
不过这二者的转换却不用计算;利用8421,对于任意一个4位的二进制数,都可以很快算出它对应的10进制值。
例如:1111=8+4+2+1=15又因为十六进制数:10~15用大写字母A~F表示,所以15为F。
八进制转二进制:利用421;从后往前每三位一组,缺位处用0填补,然后按十进制方法进行转化;例如:1—>0013- 011然后我们将结果按从下往上的顺序书写就是:11001,那么这个11001就是八进制31的二进制形式。
八进制转十进制:八进制就是逢8进1,八进制数采用0~7这八数来表达一个数;八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……例如:1507第0位:7*8^0=7第1位:0*8^1=0第2位:5*8^2=320第3位:1*8^3=512所以换算成十进制:7+0+320+512=839八进制转十六进制:八进制转换成十六进制:有两种方法:一种是先将八进制转换成二进制,在将二进制转换成十六进制。
另一种方法是将八进制转换成十进制,在将十进制转换成十六进制。
十六进制转二进制:上面已经提到二进制转换成十六进制的方法,记住8421,每一位的权值,所以十六进制转成二进制就是一段四位分别转成二进制。
例如:F→1111 ,D→1101,A→1010,5→0101十六进制转八进制:十六进制转八进制也不能直接转换,需要将十六进制转换成十进制或者二进制,才能由十进制或者二进制转换成八进制。
十六进制转十进制:16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这六个字母来分别表示10,11,12,13,14,15。
十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方〃〃〃〃〃〃所以,在第N(N从0开始)位上,如果是是数X (X 大于等于0,并且X小于等于15,即:F)表示的大小为X * 16的N次方。
例如:2AF5第0位:5*16^0=5第1位:F*16^1=240第2位:A*16^3=2560第3位:2*16^4=8192所以转换成十进制数为:10997.二、数据结构:栈:头文件“stack.h”#include<stdio.h>#include<stdlib.h>typedef enum{FALSE,TRUE} Bool; typedef int ElementType; typedef struct{int top;ElementType*elements;int MaxSize;}Stack;void InitStack(Stack*,int sz);void FreeStack(Stack*);int Push(Stack*,ElementType); ElementType Pop(Stack*); ElementType GetTop(Stack*);void MakeEmepty(Stack*);Bool IsEmpty(Stack*S);Bool IsFull(Stack*S);栈的关键操作:#include"stack.h"Bool IsEmpty(Stack*S) /*判断栈是否为空*/ {return(Bool)(S->top==-1);}void InitStack(Stack*S,int sz) /*创建栈空间,生成一个空栈*/{S->MaxSize=sz;S->elements=(ElementType*)malloc(sizeof(ElementType)*S->MaxSize);S->top=-1;}int Push(Stack*S,ElementType item) /*进栈*/{if(!IsFull(S)){S->elements[++(S->top)]=item;return 0;}else return -1;}ElementType Pop(Stack*S) /*出栈*/ {if(!IsEmpty(S))return S->elements[(S->top)--];else{printf("stack is empty!\n");exit(1);}}关键程序:/*十进制进制转换为其它*/#include"stack.h"void ShiSl(long n,int t){ int i=0, x;char Sl[100];Stack *S=(Stack*)malloc(sizeof(Stack));InitStack(S,100);while(n>0){Push(S,n%t); //关键句n/=t; //关键句}while(!IsEmpty(S)){ x=Pop(S);if(x<10)Sl[i++]=x+'0';elseSl[i++]=x-10+'a';}Sl[i]='\0';printf("其%d进制数为:\n",t); puts(Sl);printf("\n");}void main(){ int t;long shu;printf("请输要转化为几进:\n"); scanf("%d",&t);printf("请输入一个整数:\n");scanf("%ld",&shu);ShiSl(shu,t);}/*其它进制转换为十进制*/#include<stdio.h>#include<stdlib.h>void main(){ char c,Y[100];int n,i=0,k,j=0;long T=0;printf("请输入该数的进制数:\n");scanf("%d",&n);printf("请输该数位数:\n");scanf("%d",&k);fflush(stdin);for(i=0;i<k;i++){printf("请输该数第%d:\n",++j);scanf("%d",&c);Y[i]=c;}Y[i]='\0';for(i=0;Y[i]!='\0';i++){if(Y[i]>0&&Y[i]<9)T=T*n+Y[i];elseif(Y[i]>'A'&& Y[i]<'Z')T=T*n+Y[i]-'A';elseif(Y[i]>'a'&&Y[i]<'z')T=T*n+Y[i]-'a';else{ printf("输入有误!");exit(1);}}printf("该数的十进制为:");printf("%ld",T);printf("\n");}。