C语言实现:任意进制转换

用途:
用C语言程序来实现任意进制之间的转换(不止2到16之间,任意进制皆可)

思路:

  1. 以十进制数为媒介,先将需要转换的数转换成十进制数,再将其转换成目标进制数
  2. 将涉及高于十进制的转换的数挑出来,利用ASCALL码将字符转换成整型或将整型转换成字符
  3. 以取余的方式,将十进制数转换成其他进制数
  4. 以按权展开的方式,将其他进制数转换成十进制数

代码:

#include 
#include 
#include 
#include 
#include 

#define N 50

//进制转换
char * Ten_MoreThanTen(int, int);   //10进制数转换成10以上进制数的函数

int MoreThanTen_Ten(int, char []);  //10以上进制数转换成10进制数的函数

int Ten_LessThanTen(int, int);    //10进制数转换成10以内进制数的函数

int LessThanTen_Ten(int, int);    //10以内进制数转换成10进制数的函数

char array[N] = "\0";   //全局变量,用于存储转换后并且倒置了的数据

int LessThanTen_Ten(int before, int num)   //10以内转换10,参数brfore为初始进制,num为初始数值
{
    double result = 0.0;             //转换成10进制后的结果
    int i = 0;
    for(i = 0; num != 0; i++)        //利用for循环实现按权展开相加
    {
        result += pow(before, i) * (num % 10);
        num /= 10;
    }
    return (int)result;  //返回值为转换后的结果
}

int Ten_LessThanTen(int after, int num)  //10转换10以内,参数after为转换后的进制,num为10进制数值
{
    double result = 0.0;            //double类型因为pow函数的返回值为double类型
    int i = 0;
    for(i = 0; num != 0; i++)       //利用for循环实现连续取余
    {
        result += (num % after) * pow(10, i);
        num /= after;
    }
    return (int)result;
}

int MoreThanTen_Ten(int before, char num[]) //10以上转换10
{
    int i = 0;
    double result = 0.0;
    int length = strlen(num);
    for(i = length - 1; i >= 0; i--)
    {
        //利用ASCALL码将所有元素转换成对应的整型
        if('A' <= num[i] && num[i] <= 'Z')
            result += pow(before, length - i - 1) * (num[i] - 55);
        else if('a' <= num[i] && num[i] <= 'z')
            result += pow(before, length - i - 1) * (num[i] - 87);
        else if('0' <= num[i] && num[i] <= '9')
            result += pow(before, length - i - 1) * (num[i] - 48);
    }
    return (int)result;
}

char * Ten_MoreThanTen(int after, int num)   //10转换10以上
{
    int i = 0;
    int j = 0;
    int tmp = 0;    //存储每次余数的中间变量
    char tmp_array[N] = "\0";   //转换后未倒置的数组
    for(i = 0; num > 0; i++)
    {
        tmp = num % after;
        if(tmp < 10)   //对大于等于10的余数进行字母转换
            tmp_array[i] = tmp + '0';
        else
            tmp_array[i] = tmp + 'A' - 10;
        num /= after;
    }
    for(j = 0; i > 0; i--, j++)  //倒置
    {
        array[j] = tmp_array[i - 1];
        array[j + 1] = '\0';
    }
    return array;   //输出转换后存储数据的字符串地址
}

int main()
{
    int before = 0;     //转换前的进制数
    int after = 0;      //转换后的进制数
    int num1 = 0;       //要转换的十进制以内的数
    char array_num1[N] = "\0"; //要转换的十进制以上的数
    int num2 = 0;       //转换之后的数
    char *str_num2;     //转换之后的数的地址
    int tmp_num1 = 0;   //判断输入是否合法时代替num1的中间变量
    int i = 0;
    int m = 0;  //计数器
    while(1)    //整个while语句用于录入以及判断输入是否合法
    {
        printf("初始进制:");
        scanf("%d", &before);
        printf("目标进制:");
        scanf("%d", &after);
        printf("初始数值:");
        if(before > 10) //通过对初始进制判断,决定
            scanf("%s", array_num1);
        else
            scanf("%d", &num1);
        for(i = 0, tmp_num1 = num1; tmp_num1 != 0; i++)
        {
            if((tmp_num1 % 10) < before && tmp_num1 % 10 >= 0 && tmp_num1 % 10 <= 9)
                m++;
            tmp_num1 /= 10;
        }
        if(m == i)  //判断输入的数据每一位是否都小于等于进制数
            break;
        else
        {
            m = 0;  //对计数器m重新初始化
            fflush(stdin);  //清空缓存区
            printf("输入有误!请重新输入:\n");
        }
    }
    //将进制转换的四种情况分别表示
    if(before <= 10 && after <= 10)
    {
        num2 = Ten_LessThanTen(after, LessThanTen_Ten(before, num1));
        printf("\n%d进制的%d对应的%d进制数为:%d\n", before, num1, after, num2);
    }
    else if(before > 10 && after <= 10)
    {
        num2 = Ten_LessThanTen(after, MoreThanTen_Ten(before, array_num1));
        printf("\n%d进制的%s对应的%d进制数为:%d\n", before, array_num1, after, num2);
    }
    else if(before <= 10 && after > 10)
    {
        str_num2 = Ten_MoreThanTen(after, LessThanTen_Ten(before, num1));
        printf("\n%d进制的%d对应的%d进制数为:%s\n", before, num1, after, str_num2);
    }
    else if(before > 10 && after > 10)
    {
        str_num2 = Ten_MoreThanTen(after, MoreThanTen_Ten(before, array_num1));
        printf("\n%d进制的%s对应的%d进制数为:%s\n", before, array_num1, after, str_num2);
    }
    system("pause");
    
    return 0;
}

运行结果:

  • 输入初始进制:10

  • 输入目标进制:2

  • 输入初始数据:100

  • 输出转换后的数据:1100100
    C语言实现:任意进制转换_第1张图片

  • 输入初始进制:6

  • 输入目标进制:16

  • 输入初始数据:780

  • 提示:780不符合六进制数,要求重新输入

  • 输入初始进制:6

  • 输入目标进制:16

  • 输入初始数据:560

  • 输出转换后的数据:D8
    C语言实现:任意进制转换_第2张图片
    有细心同学发现了错误,由于代码中的错误导致示例也有问题,我在此改正一下。输入6进制560是不合法的,因此代码修改过后的示例为:
    C语言实现:任意进制转换_第3张图片
    多谢指点,还请大家发现问题时积极留言。

  • 输入初始进制:16

  • 输入目标进制:12

  • 输入初始数据:A2B3

  • 输出转换后的数据:2012B
    C语言实现:任意进制转换_第4张图片

**

  • 程序练习,仅为一种思路,若有错误请指出。

**

你可能感兴趣的:(C)