目录
进制转换
通常来说,常见的进制转换都是二进制,八进制,十进制,十六进制之间进行转换。不同的进制之间各有各的转换方法。但是,当我们写代码来实现进制转换功能时,如果每两个进制之间都写一个函数就太麻烦了。所以,为了方便,我们在进制转换过程中,不过是几进制转换几进制,统统把原数据转换为十进制,然后再转换为目标进制。这样我们就可以通过两个函数就可以实现进制转换功能。
对于任意进制数转换为十进制数,只需要按权展开相加即可。
对于10进制转任意进制,只需要除以任意进制的基数,然后将每一步的余数倒叙输出即可。
具体的进制之间的转换不懂得话可以百度。
注意点
由于十六进制的数里面有”A,B,C,D,E,F",然后我们没办法再int数据中储存数据,所以只能用字符串来存储原数据和转换后的数据。在进行运算的时候再把字符串转换成整数。
函数
我总共写了五个函数。to_ten函数把任意进制数转换为十进制数;to_N函数把十进制数转换成目标进制数。string_to_num和num_to_string两个函数一个是把字符转数字,另一个是数字转字符。最后stack_to_string是把进栈的字符取出来,存储在字符串中。
完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<math.h>
#define MAXSIZE 100
typedef struct
{
char *base;
char *top;
int max;
}SqStack;
int to_ten(char s[],int a);
int to_N(SqStack *stack,int data,int b);
int string_to_num(char s);
char num_to_string(int num);
int stack_to_string(SqStack stack,char string[]);
int main()
{
char num1[20]; //储存原始的数据
char num2[20]; //存储转换过后的数据
int data; //存储原数据转换为int类型的10进制数
int a,b; //a代表原数值,b代表要转换的数值
SqStack stack;
char string[20];
stack.base = (char *)malloc(MAXSIZE*sizeof(char));
stack.top = stack.base;
stack.max = MAXSIZE;
printf("please enter data\n");
scanf("%s",num1);
printf("please enter two num.\n");
scanf("%d %d",&a,&b);
//num2 = ten_to_N(s,num1,b);
data= to_ten(num1,a);
printf("%d\n",data);
to_N(&stack,data,b);
stack_to_string(stack,string);
printf("%s\n",string);
return 0;
}
int to_ten(char s[],int a)
{
int sum=0,num;
int len;
len = strlen(s);
for(int i=0;i<len;i++)
{
num = string_to_num(s[i]);
sum = sum*a + num;
}
return sum;
}
int to_N(SqStack *stack,int data,int b)
{
int num;
char s;
while(data)
{
num = data%b;
data /= b;
s = num_to_string(num);
if(stack->top - stack->base != stack->max)
{
*stack->top = s;
stack->top++;
}
else
{
printf("stack is too small.\n");
return 0;
}
}
return 1;
}
int string_to_num(char s)
{
int num;
if(s>='0'&&s<='9')
num = s-'0';
else if(s>='A'&&s<='F')
num = s-'A'+10;
else
{
printf("wrong string.\n");
return 0;
}
return num;
}
char num_to_string(int num)
{
char s;
if(num>=0&&num<=9)
s= num +'0';
else if(num>=10&&num<=15)
s= num-10 + 'A';
else
{
printf("wrong num.\n");
}
return s;
}
int stack_to_string(SqStack stack,char string[])
{
int cnt=0;
while(stack.top!=stack.base)
{
stack.top--;
string[cnt]=*stack.top;
cnt++;
}
string[cnt]='\0';
return 0;
}