c语言n进制之间的转换

输入一个字符串

a<b>c

表示将b进制数a,转换成c进制数输出
如30<10>8:将10进制数30转化为8进制数
输出:30<10>=36<8>
问题:如何提取出a,b,c进行后续进制转换?

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7589628
  • 这篇博客也不错, 你可以看下C语言之数组设数组a包括10个整型元素,用C语言编程序,求出数组a中相邻两个元素的和,并将这些和存在数组b中,按每行3个元素的形式输出。
  • 除此之外, 这篇博客: 算法入门竞赛经典(第二版)部分答案中的 输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。a,b≤106,c≤100。输 入包含多组数据,结束标记为a=b=c=0。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include<stdio.h>
    int main()
    {
    	int a, b, c,kase=0;
    	while (scanf("%d%d%d",&a,&b,&c)==3&&a&&b&&c){
    		kase++;
    		printf("Case: %d: %.*lf\n", kase, c, (double)a / b);
    	}
    	return 0;
    }
    
    ```cpp
    #define _CRT_SECURE_NO_WARNINGS
    #include<iostream>
    #include<iomanip>
    using namespace std;
    int main()
    {
    	int a, b, c,kase=0;
    	while (cin>>a>>b>>c&&a&&b&&c){
    		kase++;
    		cout << "Case " << kase << ":" << setprecision(c) << (double)a / b << endl;	
    	}
    	return 0;
    }
    

    温馨提示:小数点.后“”表示输出位数,具体的数据来自参数表
    printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量,方法就是使用一个“
    ”代替那个常量,然后在后面提供变量给“*”。

    同样,小数点.前也可以添加*,也要用户输入一个位宽值来代替,表示输出的字符所占位宽。

  • 以下回答由chatgpt基于相关博客总结生成:

    我可以解决该问题。可以将问题分为以下步骤:

    1. 提取出给定字符串中的 a,b,c 三个数字;
    2. 将 a 转化为十进制数;
    3. 将十进制的 a 转化为 c 进制数;
    4. 输出转化后的结果。

    针对以上步骤,可以使用以下伪代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    // 十六进制输出方法
    void print_hex(int n) {
        char hex[16] = "0123456789ABCDEF";
        putchar(hex[n / 16]);
        putchar(hex[n % 16]);
    }
    
    int main() {
        char input[10];      // 存放输入的字符串
        int a, b, c;         // 存放 a,b,c 三个数字
        int decimal = 0;     // 存放 a 的十进制数
        int remainder[100];  // 存放转化后的余数
        int i, j;            // 循环计数器
    
        // 输入字符串,例如 "30<10>8"
        scanf("%s", input);
    
        // 提取出 a,b,c 三个数字,例如 a=30, b=10, c=8
        sscanf(input, "%d<%d>%d", &a, &b, &c);
    
        // 将 a 转化为十进制
        for (i = 0; i < 100 && a > 0; i++) {
            remainder[i] = a % 10;
            a /= 10;
            decimal += remainder[i] * pow(b, i);
        }
    
        // 将十进制的 a 转化为 c 进制
        i = 0;
        while (decimal > 0) {
            remainder[i] = decimal % c;
            decimal /= c;
            i++;
        }
    
        // 输出转化后的结果
        printf("%d<%d>=", a, b);
        for (j = i-1; j >= 0; j--) {
            if (c == 16) {    // 如果是十六进制,使用 print_hex 输出
                print_hex(remainder[j]);
            } else {
                printf("%d", remainder[j]);
            }
        }
        printf("<%d>\n", c);
    
        return 0;
    }
    

    需要注意的地方:

    1. 使用 sscanf 函数从字符串中提取出 a,b,c。这里的格式化字符串 "%d<%d>%d" 表示提取的数字格式为 "ac"。
    2. 对于转换后的每一位,需要判断是否需要按十六进制格式输出。可以使用 print_hex 函数实现;
      • 在使用 pow 函数计算 b 的幂时,需要包含 math.h 头文件。

    以上就是使用 C 语言实现 n 进制转换的具体解决方案。

假设输入数据 char data[SIZE],找到 < 和 > 的位置,取出三个数分别放入三个不同的字符数组如 a[], b[], c[]。int i = atoi(a) 将字符数组a转换成整数i

#include<stdio.h>
int main()
{
    int a, b, c,kase=0;
    while (scanf("%d%d%d",&a,&b,&c)==3&&a&&b&&c){
        kase++;
        printf("Case: %d: %.*lf\n", kase, c, (double)a / b);
    }
    return 0;
}
 
```cpp
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    int a, b, c,kase=0;
    while (cin>>a>>b>>c&&a&&b&&c){
        kase++;
        cout << "Case " << kase << ":" << setprecision(c) << (double)a / b << endl;    
    }
    return 0;
}