1 条题解

  • 0
    @ 2025-4-20 20:53:55

    说明

    这段代码实现了将一个数字从一种进制转换为另一种进制的功能。支持的进制范围是2到62,其中数字符号包括0-9、A-Z(表示10-35)、a-z(表示36-61)。程序能够正确处理大数转换,并按照指定格式输出转换结果。

    算法标签

    • 大数处理:处理超出基本数据类型范围的数字。
    • 进制转换:实现任意进制之间的转换。
    • 字符串处理:将数字表示为字符串以便处理大数。

    解题思路

    1. 问题分析:需要将输入的数字从原始进制转换为目标进制。由于数字可能非常大,必须使用字符串来表示和处理。
    2. 关键步骤
      • 字符到数字的转换:将输入字符串的每个字符转换为对应的数值。
      • 进制转换算法:采用除基取余法,将原始进制的数字逐步转换为目标进制。
      • 数字到字符的转换:将转换后的数值转换为对应的字符表示。
    3. 算法选择
      • 使用数组存储大数,模拟手工计算过程。
      • 通过循环除法和取余操作实现进制转换。

    分析

    1. 输入处理:读取输入进制、输出进制和数字字符串。
    2. 字符转换:将数字字符串的每个字符转换为对应的数值,存储到数组中。
    3. 进制转换
      • 使用除基取余法,将原始进制的数字逐步转换为目标进制。
      • 每次除法操作后,更新数组中的数值,直到所有位数处理完毕。
    4. 结果输出:将转换后的数值数组转换为字符形式,按格式输出。

    实现步骤

    1. 读取输入:读取测试用例数量及每个测试用例的输入进制、输出进制和数字字符串。
    2. 字符到数字转换:将输入字符串转换为数值数组。
    3. 进制转换
      • 初始化余数数组。
      • 循环处理数值数组,直到所有位数处理完毕:
        • 对当前数值进行除法操作,得到商和余数。
        • 存储余数,更新数值数组为商。
    4. 数字到字符转换:将余数数组转换为字符形式。
    5. 输出结果:按格式输出原始进制、原始数字、目标进制和转换后的数字。

    代码解释

    • 字符转换函数
      • getNum(char c):将字符转换为对应的数值(0-61)。
      • getChar(int i):将数值(0-61)转换为对应的字符。
    • 字符串转换函数
      • chToNum():将输入字符串转换为数值数组a
    • 进制转换函数
      • alter():实现除基取余法,将原始进制的数值数组a转换为目标进制的余数数组r
    • 主函数
      • 读取输入,调用转换函数,输出结果。

    通过这种方法,程序能够高效且准确地完成大数的任意进制转换。

    代码

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define MAXSIZE 60000
     
    char in[MAXSIZE];
    int oldbase,newbase;
    int a[MAXSIZE],b[MAXSIZE],r[MAXSIZE];
     
    inline int getNum(char c)
    {
        if(c >= '0' && c <= '9') return c - '0';
        if(c >= 'A' && c<= 'Z' ) return c - 'A' + 10;
        return c - 'a' + 36;
    }
     
    inline char getChar(int i)
    {
        if(i >= 0 && i <= 9) return i + '0';
        if(i >= 10 && i <= 35) return i - 10 + 'A';
        return i - 36 + 'a';
    }
     
    inline void chToNum()
    {
        a[0] = strlen(in);
        for(int i=1;i<=a[0];i++)
        {
            a[i] = getNum(in[i-1]);
        }
    }
     
    void alter()
    {
        while(a[0] >= 1)
        {
            int i,t = 0;
            for(i=1;i<=a[0];i++)
            {
                t = t * oldbase + a[i];
                b[ ++b[0] ] = t / newbase;
                t %= newbase;
            }
            r[ ++r[0] ] = t;
            b[0] = a[0];
            for(i = 1; i <= b[0] && !b[i]; i++) ;
            for(a[0] = 0; i <= b[0]; i++) a[ ++a[0] ] = b[i];
            memset(b,0,sizeof(b));
        }
    }
     
    void print()
    {
        printf("%d %s\n%d ",oldbase,in,newbase);
        while(r[0]>=1)
        {
            printf("%c",getChar(r[ r[0]-- ]));
        }
        printf("\n\n");
    }
     
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            while(n--)
            {
                scanf("%d %d %s",&oldbase,&newbase,in);
                chToNum();
                alter();
                print();
            }
        }
        return 0;
    }
    • 1

    信息

    ID
    221
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者