任意进制之间的转换 C语言

目录

进制转换

通常来说,常见的进制转换都是二进制,八进制,十进制,十六进制之间进行转换。不同的进制之间各有各的转换方法。但是,当我们写代码来实现进制转换功能时,如果每两个进制之间都写一个函数就太麻烦了。所以,为了方便,我们在进制转换过程中,不过是几进制转换几进制,统统把原数据转换为十进制,然后再转换为目标进制。这样我们就可以通过两个函数就可以实现进制转换功能。

对于任意进制数转换为十进制数,只需要按权展开相加即可。

对于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;
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值