任何进制的相互转化

1、问题:
给定一个M进制的数x,实现对x向任意的一个非M进制的数的转换。

2、问题分析
几种不同的转换方向:

  1. 二进制、八进制、十六进制向十进制转换:按权展开相加。
  2. 十进制向二进制、八进制、十六进制转换:整数部分除以基数取余数(取余的方向从后往前);小数部分乘以基数取整数(取整从前往后)
  3. 二进制、八进制、十六进制相互转化:全部转化为十进制,然后按照其对应关系转化。

3、算法设计
将输入的任何数字和字母存到字符数组中,然后在进行转化,在数组元素进行数制转换时又以数值的形式存在,所以涉及的字符与数字的相互转换。

下面讲一下具体函数的编写。

1、数字与字符的相互转换

int char_to_num(char ch)//字符向数字转换
{
     if(ch >= '0' && ch <= '9')
         return ch - '0';
     else
         return ch - 'A' + 10;
}

char num_to_char(int num)//数字向字符转换
{
    if(num >= 0 && num <= 9)
        return(char)('0' + num - 0);
    else
        return(char)('A' + num - 10);

}

2、其他数制转化为十进制
字符由键盘输入,每次输入的字符串可能不同,也可能达不到最大的字符个数,所以要先确定字符数组中有效字符的个数。

for(i = 0; temp[i] != '\0';i++);
count = i;//得到有效字符的个数
long source_to_decimal(char temp[],int source)
{
     long decimal_num = 0;
     int length;
     int i;
     for(i = 0; temp[i] != '\0';
     length = i;
     for(i = 0; i < length - 1; i++)
     {
         deciaml_num = (decimal_num *source) + char_to_num(temp[i]);
     }
     return decimal_num;

}

3、十进制转化其他的数制

int deciaml_to_object(char temp[],long decimal_num,int object)
{
     int i = 0;
     while(decimal_num)
     {
         temp[i] = num_to_char(decimal % object);
         decimal_num = decimal_num / object;
         i++;
      }
      temp[i] = '\0';
      return i;
}

4、逆序输出。

由于余数组成的新制数与余数的方向相反

void output(char temp[],int length)
{
   int i;
   for(i = length - 1; i >= 0; i--)
       printf("%c",temp[i]);
   printf("\n");
}

完整代码

#include <stdio.h>

#define MAXCHAR 101

int char_to_num(char ch)
{
    if(ch >= '0' && ch <= '9')
    {
        return ch - '0';
    }
    else
    {
        return ch - 'A' + 10;

    }

}

char num_to_char(int num)
{

    if(num >= 0 && num <= 9)
    {
        return (char)('0' + num - 0);

    }
    else
    {
        return (char)('A' + num - 10);
    }

}

long source_to_decimal(char temp[],int source)
{
    long decimal_num = 0;
    int length;
    int i;

    for(i = 0; temp[i] != '\0'; i++ );
    length = i;

    for(i = 0; i <= length - 1; i++)
    {
        decimal_num = (decimal_num * source) + char_to_num(temp[i]);

    }

    return decimal_num;
}

int decimal_to_object(char temp[],long decimal_num,int object)
{
    int i = 0;

    while(decimal_num)
    {
        temp[i] = num_to_char(decimal_num % object);
        decimal_num = decimal_num / object;
        i++;

    }

    temp[i] = '\0';
    return i;
}

void output(char temp[],int length)
{
    int i;
    for(i = length - 1; i >= 0; i--)
    {
        printf("%c",temp[i]);
    }
    printf("\n");
}

int main()
{
    int source;
    int object;
    int length;
    long decimal_num;
    char temp[MAXCHAR];

    int flag = 1;

    while(flag)
    {
        printf("转换之前的数:");
        scanf("%s",temp);

        printf("转换之前的数制:");
        scanf("%d",&source);

        printf("转换之后的数制:");
        scanf("%d",&object);

        printf("转换之后的数");

        decimal_num = source_to_decimal(temp,source);
        length = decimal_to_object(temp,decimal_num,object);
        output(temp,length);

        printf("继续请输入1,否则输入0:\n");
        scanf("%d",&flag);
    }


    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值