#include <stdio.h>
#include <string.h>
#include <math.h>
int top=-1; //top 变量时刻表示栈顶元素所在位置
void push(char* a,char elem)
{
a[++top]=elem;
}
void pop(char* a)
{
if(top==-1)
{
return;
}
//输出时要按照正确的格式显示给用户
if (a[top]>=10)
{
printf("%c",a[top]+55);
}
else{
printf("%d",a[top]);
}
top--;
}
//将各进制数转换成十进制数
int scaleFun(char* data,int system)
{
int k=(int)strlen(data)-1;
int system_10_data=0;
int i;
for(i=k;i>=0;i--)
{
int temp;
//字符转数字
if(data[i]>=48 && data[i]<=57)
{
temp=data[i]-48;
}
else
{
temp=data[i]-55;
}
//按权相加获得10进制
system_10_data+=temp*pow(system,k-i);
}
return system_10_data;
}
int main()
{
char data[100];
printf("进制转换器,请输入原数据的进制(2-36):");
int system;
scanf("%d",&system);
getchar(); //清除回车符
printf("请输入要转换的数据:");
scanf("%s",data);
getchar();
int system_10_data=scaleFun(data,system);
printf("请输入转换后的数据的进制:");
int newSystem;
scanf("%d",&newSystem);
getchar();
/*十进制整数转换为 N 进制整数采用“除 N 取余,逆序排列”法。具体做法是:
将 N 作为除数,用十进制整数除以 N,可以得到一个商和余数;
保留余数,用商继续除以 N,又得到一个新的商和余数;
仍然保留余数,用商继续除以 N,还会得到一个新的商和余数;
把先得到的余数作为 N 进制数的低位数字,后得到的余数作为 N 进制数的高位数字,
依次排列起来,就得到了 N 进制数字。*/
while(system_10_data/newSystem)
{
push(data,system_10_data%newSystem);
system_10_data/=newSystem;
}
push(data,system_10_data%newSystem);
printf("转换后的结果为:\n");
while(top!=-1)
{
pop(data);
}
printf("\n");
}
root@book-virtual-machine:/mnt/hgfs/lua/C++# g++ -std=c++11 salman_0119.cpp -o salman_0119
root@book-virtual-machine:/mnt/hgfs/lua/C++# ./salman_0119
进制转换器,请输入原数据的进制(2-36):10
请输入要转换的数据:100
top==-1请输入转换后的数据的进制: