用栈实现任意进制转换

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define N 30


typedef struct s
{
int data;
struct s*next;
}ss; 
                                              //节点
ss*push(ss*h,char m[],int b1,int b2)          //进栈

int i,j,length,s=0;
char ch;
ss*p;
    length = strlen(m);
for(i = length-1,j = 0;i >= 0;i--,j++)
{
if(m[i]>='0'&&m[i]<='9')
{
ch = m[i]-48;
s  = s + (int)pow(b1,j)*ch;
}
   else if(m[i]>='A' && m[i]<='Z')
{
ch = m[i]-55;
s  = s+(int)pow(b1,j)*ch;
}
else if(m[i]>='a' && m[i]<='z')
{
ch = m[i]-87;
s  = s+(int)pow(b1,j)*ch;
}
}                                      //转换为十进制数 s
for(i = 0 ; s ; i++)
{
p = (ss*)malloc(sizeof(ss));
p->data = s%b2;
    s/=b2;
p->next = h;
h = p;
}
return h;
}      
                                 
ss*pop(ss*h)                              //出栈
{
ss*p;
if(h->data>=0&&h->data<=9)
printf("%d",h->data);
else
printf("%c",h->data+87);
p=h;
h=h->next;
free(p);
return h;
}       
                               
int check(char m[],int b1)              //检查错误输入    
{
int length,i;
length=strlen(m);
for(i=0;i<length;i++)
{
if(!((m[i]>='0'&&m[i]<='9')||(m[i]>='A'&&m[i]<='Z')||(m[i]>='a'&&m[i]<='z')))
break;
if(b1<2||b1>36)
break;
if(b1>=2&&b1<=10)
if(m[i]>=b1+48)
break;
   if(b1>=11)
if(m[i]>=b1+87)
break;
}
if(i==length)
return 1;
else return 0;
}


main()
{
ss*h;
int a=1,b1,b2,sign;
char m[N];
h=NULL;
printf("\t\t   *****欢迎使用进制转换的程序*****\n\n\t\t###二进制到三十六进制之间任意进制转换###\n\n");
while(1)
{
if(a!=1)
{
printf("\t\t请问是否要再转换一个:1.是    2.否\n");
scanf("%d",&a);
}
switch(a)
{
case 1:
while(1)
{
printf("请输入要转换的数及其基数,用空格键隔开,如:56 10代表十进制数56\n");
scanf("%s%d",m,&b1);
if(sign=check(m,b1))
break;
else
printf("输入错误!请重新输入!\n");
}
printf("请输入结果的基数:\n");
scanf("%d",&b2);
h=push(h,m,b1,b2);
printf("%d进制数:%s 转换为%d进制数:",b1,m,b2);
while(h)
h=pop(h);
printf("\n\n");
a++;
break;
case 2:exit(0);
default:printf("输入错误!请重新输入!\n");
}
}
}                               
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值