采用链栈, 基本流程为:先将任意进制转化为十进制,再将十进制转化为目标进制, 达到任意进制转化任意进制的功能。
中间函数:将任意进制转化为十进制
int Anysystem_convert_TenSystem(char *s,int n)
{
int sum=0;
int num_size= strlen(s);
for(int k=0;k<num_size;k++)
{
if(s[k]>='0'&&s[k]<='9') // 处理数字
sum=sum+(int(s[k]-'0'))*pow(n,num_size-k-1);
else if(s[k]>='A'&&s[k]<='Z') // 处理十进制以上的字母
sum=sum+int(s[k]-55)*pow(n,num_size-k-1);
}
return sum;
}
将十进制转化为目标进制:
void Convert_system(LinkStack *p,int N,int n) // n表示目标进制.
{
LinkStackNode *ptr=p->top;
while(N!=0) // 余数依次进栈
{
Push_LinkstackNode(p,N%n);//入栈
N/=n;
}
while(p->length)
{
int data= pop_LinkStack(p);
if(data>9) // 对超过9的数字进行特殊处理。
{
data=data+55;
printf("%c",data);
}
else
printf("%d",data); // 小于9的数字直接进行输出
}
}
源代码
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "math.h"
typedef struct LinkStackNode
{
int data;
LinkStackNode *next;
}LinkStackNode;
typedef struct LinkStack
{
LinkStackNode *top;
int length;
}LinkStack;
LinkStack *initialize_stack()//链栈的初始化
{
LinkStack *p = (LinkStack *) malloc(sizeof(LinkStack));
p->length = 0;
p->top = NULL;
return p;
}
void Push_LinkstackNode(LinkStack *p,int data)//入栈
{
if(!p) return;
LinkStackNode *temp=(LinkStackNode *) malloc(sizeof(LinkStackNode));
temp->data=data;
temp->next=p->top;
p->top=temp;
p->length++;
}
int pop_LinkStack(LinkStack *p)//出栈
{
if(!p) return 1;
int data;
LinkStackNode *temp=p->top;
data=temp->data;
p->top=temp->next;
p->length--;
free(temp);
return data;
}
int Anysystem_convert_TenSystem(char *s,int n)//N代表该数字 n代表进制数 转化为10进制
{
int sum=0;
int num_size= strlen(s);
for(int k=0;k<num_size;k++)
{
if(s[k]>='0'&&s[k]<='9')
sum=sum+(int(s[k]-'0'))*pow(n,num_size-k-1);
else if(s[k]>='A'&&s[k]<='Z')
sum=sum+int(s[k]-55)*pow(n,num_size-k-1);
}
return sum;
}
void Convert_system(LinkStack *p,int N,int n)//把十进制数转换为其它
{
LinkStackNode *ptr=p->top;
while(N!=0)
{
Push_LinkstackNode(p,N%n);//入栈
N/=n;
}
while(p->length)
{
int data= pop_LinkStack(p);
if(data>9)
{
data=data+55;
printf("%c",data);
}
else
printf("%d",data);
}
}
int main()
{
char s[20];
int N_next,N_ptr,num_ptr,num_next;
LinkStack *Stack=initialize_stack();
printf("输入转换之前的进制:");
scanf("%d",&N_ptr);
printf("输入转换后的进制:");
scanf("%d",&N_next);
printf("请输入你想要转换的数字:");
scanf("%s",s);
num_next= Anysystem_convert_TenSystem(s,N_ptr);
Convert_system(Stack,num_next,N_next);
}