#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");
}
}
}
#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");
}
}
}