码迷,mamicode.com
首页 > 其他好文 > 详细

7.3 进制转换

时间:2016-07-19 20:44:43      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

7-4 NumberTrans.c

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define STACK_INIT_SIZE  100
  4 #define SIZE_INCREMENT  5
  5 typedef struct //栈结构 
  6 {
  7     int *base; //栈底 
  8     int *top; //栈顶 
  9     int stacksize; //栈大小 
 10 }SqStack,*SQSTACK;
 11 int StackInit(SQSTACK s) //初始化栈 
 12 {
 13     s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
 14     if(!(s->base))
 15         exit(0);
 16     s->top=s->base;
 17     s->stacksize=STACK_INIT_SIZE;
 18     return 1;
 19 }
 20 int PUSH(SQSTACK s,int e) //入栈 
 21 {
 22     if(s->base+s->stacksize==s->top)
 23     {
 24         s->base=(int *)realloc(s->base,(SIZE_INCREMENT+s->stacksize)*sizeof(int));
 25         s->top=s->base+s->stacksize;
 26         s->stacksize+=SIZE_INCREMENT;
 27     }
 28     *(s->top)=e;
 29      s->top+=1;
 30      return 1;
 31 }
 32 int POP(SQSTACK s,int *p) //出栈 
 33 {
 34     if(s->base==s->top) //空栈 
 35         return 0;
 36      *p=*(s->top-1);
 37      s->top--;
 38      return 1;
 39 }
 40 int StackLength(SQSTACK s) //栈的长度(元素数量) 
 41 {
 42     return (s->top-s->base);
 43 }
 44 int StackFree(SQSTACK s) //释放栈 
 45 {
 46     free(s->base);
 47     s->top=s->base=NULL;
 48     return 1;
 49 }
 50 char *DecToOther(unsigned long num,int sys) //10进制转换为其他进制,返回一个字符串 
 51 {//num需转换的数据,sys为需转换的进制 
 52     SqStack s;
 53     int rem,i,length,num1,inc=1;
 54     char *out,*p; //控制输出字符串 
 55     if(!StackInit(&s)) //初始化栈失败 
 56         exit(0);//退出
 57     do{
 58         if(num<sys) //被除数小于进制 
 59         {
 60             rem=num;
 61             PUSH(&s,rem); //进接将被除数入栈 
 62             break;//退出循环 
 63         }
 64         else
 65         {
 66             rem=num % sys; //除进制数取余数 
 67             PUSH(&s,rem); //将余数入栈 
 68             num=(num-rem)/sys; //
 69         }
 70     }while(num); //dividend不为0
 71     if(sys==16) //16进制有两个字符的前缀 
 72         inc++;
 73     length=StackLength(&s); //获取栈的长度(需输出元素的个数) 
 74     if(!(out=(char *)malloc(sizeof(char)*(length+inc))))//若分配内存失败
 75     {
 76         printf("内存分配失败!\n");
 77         exit(0);
 78     } 
 79     p=out; //指针p指向分配内存首地址 
 80     *p++=0;//添加前缀    
 81     if(sys==16) //16进制的前缀 
 82         *p++=x;
 83     for(i=1;i<=length;i++)
 84     {
 85         POP(&s,&num1); //从栈中弹出一个数 
 86         if(num1<10) //若小于10
 87             *p++=num1+0; //保存数字的ASCII字符 
 88         else //大于10,输出A~F 
 89             *p++=num1+A-10;//输出A~F之间的字母 
 90     }
 91     StackFree(&s); //释放栈所占用空间 
 92     *p=\0;
 93     return (out);//返回字符串 
 94 }
 95 int OtherToDec(int sys,char *in_str) //其他进制转换为10进制(输入数)
 96 { //sys进制,arrat_char需处理的字符串 
 97     int i,j,length,start=0;
 98     unsigned long sum=0,pow;
 99     int *in_bit;
100        
101     length=strlen(in_str); //字符串的长度 
102     if(!(in_bit=(int *)malloc(sizeof(int)*length)))
103     {
104         printf("内存分配失败!\n");
105         exit(0); 
106     }
107     if(in_str[0]==-) //为负数,跳过符号 
108         start++;
109     j=0;
110     for(i=length-1;i>=start;i--)
111     {
112         if(in_str[i]>=0 && in_str[i]<=9) //为数字0~9 
113             in_bit[j]=in_str[i]-0; //将字符转换为整数 
114         else if(in_str[i]>=A && in_str[i]<=F) //大写字母 A~F
115             in_bit[j]=in_str[i]-A+10;
116         else if(in_str[i]>=a && in_str[i]<=f) //小写字母 a~f
117             in_bit[j]=in_str[i]-a+10;
118         else
119             exit(0);
120         j++;
121     }
122     length-=start; 
123     for(i=0;i<length;i++)
124     {
125         if(in_bit[i]>=sys) //若某个数超过了进制 
126         {
127             printf("输入的数据不符合%d进制数据的规则!",sys); //显示错误 
128             exit(0);
129         }
130         for(j=1,pow=1;j<=i;j++)
131             pow*=sys;
132         sum+=in_bit[i]*pow;
133     }
134     return sum;
135 }
136 
137 int main()
138 {
139     int old,new1;
140     char select=N,*other,str[80]; //符号
141     unsigned long num10; //保存10进制数 
142     char array[32];
143     do{
144         printf("\n原数据进制:");
145         scanf("%d",&old);
146         printf("输入%d进制数:",old);
147         scanf("%s",str); //保存字符串 
148         num10=OtherToDec(old,str); //将其他进制转换为10进制 
149         printf("需转换的进制:");
150         scanf("%d",&new1);
151         if(10==new1) //若是转换为10进制 
152         {
153             printf("\n将%d进制数%s\n转换为10进制数:%d\n",old,str,num10); 
154         }
155         else
156         {
157             other=DecToOther(num10,new1);
158             printf("将%d进制数%s\n转换为%d进制数:%s\n",old,str,new1,other);
159         }
160         printf("\n继续(Y/N)?");
161         select=getch();
162     }while(select==y || select ==Y);
163     getch();
164     return 0;
165 }

 

7.3 进制转换

标签:

原文地址:http://www.cnblogs.com/wozixiaoyao/p/5686010.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!