思路:
将输入的数据,先转换为10进制数,再转换成期望的数
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
typedef struct Node {
char *base;//指向栈底
char *top;//指向栈顶
int size;
//size = 99;
}*stack;
stack init(){//栈的初始化
//int n;
stack s = (stack)malloc(sizeof(stack));
s->base = (char*)malloc(sizeof(char)*64);
if(!s->base)
return NULL;
//scanf("%d",&n);
s->size = 64;
printf("初始化成功\n");
s->top = s->base;
s->size = 64;
return s;
}
int full_stack(stack s){//判断是否栈空
if(s->top - s->base == 64)
return 1;
else
return 0;
}
int empty_stack(stack s){
if(s->top == s->base)
return 1;
else
return 0;
}
void push_stack(stack s,char n){//压栈
if(full_stack(s) == 1){
printf("已经栈满,无法添加!\n");
return;
}
else {
*(s->top++) = n;
// printf("入栈成功\n");
}
}
void pop_stack(stack s,char*e){
if(empty_stack(s) == 1){
printf("已经栈空!\n");
return ;
}
else{
*e = *(--s->top);
}
}
char* BinChange(stack s,int n);
char* OctChange(stack s,int n);
char* HexChange(stack s,int n);
char* Change(stack s,int n,int q);
int DecChange(stack s,char*p,int q);
void judge(){
stack s = init();
printf("请输入待转换数据的类型:(2,8,16)\n");
int q,n;
scanf("%d",&q);
printf("请输入您要转换的数据:\n");
char arr[64];
scanf("%s",arr);
char*temp = arr;
int i;
if(q<16)
for(i=0;i<strlen(arr);i++){
if((int)arr[i]-48>= q || (int)arr[i]-48< 0)
{
printf("%d\n",(int)arr[i]-48);
printf("%d\n",i);
printf("数据类型不匹配!");
return;
}
}else
for(i=0;i<strlen(arr);i++)
if( ( (int)arr[i]-48>=9 && ((int)arr[i]-55<=0 ||(int)arr[i]-55>=q) ) || (int)arr[i]-48<=0)
{
printf("数据类型不匹配!");
return;
}
char*p = (char*)malloc(sizeof(char)*64);
char*p1 = (char*)malloc(sizeof(char)*64);
strcpy(p,arr);
printf("请输入期望的类型:\n");
scanf("%d",&n);
int tot;
tot = DecChange(s,p,q);
printf("十进制后为%d\n",tot);
stack sp = init();
switch(n){
case 2: p1 = BinChange(sp,tot);break;
case 8: p1 = OctChange(sp,tot);break;
case 16: p1 = HexChange(sp,tot);break;
default : p1 = Change(sp,tot,n);break; //printf("输入非法!\n")
}
}
int main(){
judge();
}
char* BinChange(stack s,int n)//转二进制
{
int temp;
int i,cnt;
char ch = '0';
char *p = malloc(sizeof(char)*64);
while(n!=0){
temp = n/2;
i = n-temp*2;
printf("%c",(char)ch+i);
push_stack(s,ch+i);
cnt++;
n/=2;
}
while(empty_stack(s)!=1){
//printf("!!!\n");
pop_stack(s,&ch);
*p++ = ch;
printf("%c",*(p-1));
}
return p;
}
char* OctChange(stack s,int n){
int temp;
int i,cnt;
char ch = '0';
char *p = malloc(sizeof(char)*64);
while(n!=0){
temp = n/8;
i = n-temp*8;
push_stack(s,ch+i);
cnt++;
n/=8;
}
while(empty_stack(s)!=1){
pop_stack(s,&ch);
*p++ = ch;
printf("%c",*(p-1));
}
return p;
}
char* HexChange(stack s,int n){
int temp;
int i,cnt;
char ch = '0';
char *p = malloc(sizeof(char)*64);
while(n!=0){
temp = n/16;
i = n-temp*16;
if(i<10 && i>0)
push_stack(s,ch+i);
if(i>=10 && i<15 )
{
i-=10;
push_stack(s,'A'+i);
}
cnt++;
n/=16;
}
while(empty_stack(s)!=1){
pop_stack(s,&ch);
*p++ = ch;
printf("%c",*(p-1));
}
return p;
}
char* Change(stack s,int n,int q){
int temp;
int i,cnt;
char ch = '0';
char *p = malloc(sizeof(char)*64);
while(n!=0){
temp = n/q;
i = n-temp*q;//判断除以q后的余数
if(i<10 && i>0)
push_stack(s,ch+i);
if(i>=10 && i<q-1 )
{
i-=10;
push_stack(s,'A'+i);
}
cnt++;
n/=q;
}
while(empty_stack(s)!=1){
pop_stack(s,&ch);
*p++ = ch;
printf("%c",*(p-1));
}
return p;
}
int DecChange(stack s,char*p,int q){
int len = strlen(p);
int i;
char temp='0';
int cap=0;
for(i=0;i<len;i++){
//printf("\np ASCII:%d\n",(int)*p-48);
push_stack(s,*p++);
//printf("%c\n",*(s->top-1));
}
for(i=0;i<len;i++){
if(q!=16){
pop_stack(s,&temp);
//printf("temp:%c\n",temp);
cap+=((int)pow(q,i)*((int)temp-48));
//printf("cap:%d\n",cap);
}
if(q==16){
pop_stack(s,&temp);
if((int)temp-48<=9 && (int)temp-48>=0)
{
//printf("temp<10:%c\n",temp);
cap+=((int)pow(q,i)*((int)temp-48));
//printf("cap:%d\n",cap);
}
else if((int)temp-55>=0 && (int)temp-55<=q)
{
//printf("temp>10:%c\n",temp);
cap+=((int)pow(q,i)*((int)temp-55));
//printf("cap:%d\n",cap);
}
}
}
return cap;
}