error120 2023-12-10 16:12 采纳率: 100%
浏览 10
已结题

浮点数进制转换C语言

写浮点制进制转换的时候,oj平台编译怎么老是报错过不了啊,本地跑的时候过的挺好的
给学长哥看看我的破烂代码,浮点制转换那个是看你的,然后整数那个是我自己写的:

#include<stdio.h>
#include<string.h>
#include<math.h> 
#include<stdlib.h>
void intreverse(char C[100], char arr[100], int A, int B)
{
    //转化十进制:
    int count = 0, sum = 0, l = 0;
    while (C[count] != '.')
    {
        count++;
    }
    int i = count - 1, j = 0;
    while (i > -1)
    {
        if (C[i] >= 48 && C[i] <= 57)
            sum += pow(A, j++) * (C[i--] - 48);
        else
            sum += pow(A, j++) * (C[i--] - 87);
    }
    i = 0;
    if (sum == 0)
    {
        arr[i++] = '0';
    }
    while (sum)
    {
        if ((sum % B) >= 0 && (sum % B) <= 9)
        {
            arr[i++] = sum % B + 48;
            sum /= B;
        }
        else
        {
            arr[i++] = sum % B + 87;
            sum /= B;
        }
    }
    arr[i] = '.';
    int r = --i;
    while (r > l)
    {
        char temp = arr[r];
        arr[r--] = arr[l];
        arr[l++] = temp;
    }
}
void doublereverse(char C[100], char arr[100], int A, int B)
{
    int count = 0,sz;
    double sum = 0.0;
    while (C[count++] != '.')
    {
        ;
    }
    int i = count, j = -1;
    while (i <= strlen(C) - 1)
    {
        if (C[i] >= 48 && C[i] <= 57)
            sum += pow(A, j--) * (C[i++] - 48);
        else
            sum += pow(A, j--) * (C[i++] - 87);
    }
    count = 0;
    while (arr[count++] != '.')
    {
        ;
    }
    if (sum == 0)
    {
        arr[count] = '0';
    }
    int ret = count;
    while (sum!=0)
    {
        sz = sum * B;
        if (sz > 9)
        {
            arr[count++] = sz + 87;
            sum = sum * B - sz;
        }
        else
        {
            arr[count++] = sz + 48;
            sum = sum * B - sz;
        }
    }
    for (i = 0; i <ret + 8; i++)
    {
        printf("%c", arr[i]);
    }
}

char* convert_base(char* C, int A, int B) {
    // 将 A 进制的数 C 转换为十进制数 D
    int decimal_value = 0;
    int length = strlen(C);
    
    for (int i = 0; i < length; i++) {
        int digit_value = 0;
        
        if (C[i] >= '0' && C[i] <= '9') {
            digit_value = C[i] - '0';
        } else if (C[i] >= 'a' && C[i] <= 'z') {
            digit_value = C[i] - 'a' + 10;
        } else {
            printf("Invalid input\n");
            return NULL;
        }
        
        if (digit_value >= A) {
            printf("Invalid input\n");
            return NULL;
        }
        
        decimal_value = decimal_value * A + digit_value;
    }
    
    // 将十进制数 D 转换为 B 进制的数
    int max_digits = 11;  // 最大长度为 10 位(根据题目要求修改)
    char* result = (char*)malloc((max_digits+1) * sizeof(char));  // +1 是为了存储字符串结束符 '\0'
    int i = max_digits - 1;  // 从最后一位开始填充
    
    while (decimal_value > 0 && i >= 0) {
        int remainder = decimal_value % B;
        
        if (remainder < 10) {
            result[i] = remainder + '0';
        } else {
            result[i] = remainder - 10 + 'a';  // 将大于等于 10 的余数转换为小写字母
        }
        
        decimal_value /= B;
        i--;
    }
    
    if (i < 0) {
        printf("Result exceeds maximum length\n");
        free(result);
        return NULL;
    }
    
    // 将结果复制到新的内存空间中,并添加字符串结束符
    char* final_result = (char*)malloc((max_digits-i) * sizeof(char));
    strcpy(final_result, result+i+1);
    free(result);
    
    return final_result;
}

int main()
{
    int A, B;
    char C[100], arr[100];
    int i = 0;
    scanf("%d %d %s", &A, &B, C);
    memset(arr, 0, sizeof(char[100]));
    int tmp = strcspn(C,".");
    if(tmp == strlen(C)){
        char* result = convert_base(C, A, B);
    
    if (result != NULL) {
        printf("%s\n", result);
        free(result);
    }
    }
    else{
    intreverse(C, arr, A, B);
    doublereverse(C, arr, A, B);
    }
}
  • 写回答

2条回答 默认 最新

  • DTcode7 优质创作者: 前端开发技术领域 2024-06-05 10:09
    关注

    答案引用自chatgpt生成,望对题主有所帮助/启发;若有帮助,还望采纳!

    在C语言中,浮点数的进制转换通常涉及到整数和浮点数之间的转换。这是因为计算机内部使用二进制表示所有的数据,包括整数和浮点数。

    1. 整数转浮点数:你可以直接通过赋值操作将一个整数转换为浮点数。例如:

      int i = 10;
      float f = (float)i;
      

      在这个例子中,我们将整数10转换为了浮点数10.0。

    2. 浮点数转整数:你可以通过强制类型转换将一个浮点数转换为整数。但是需要注意的是,这种转换会丢失小数部分。例如:

      float f = 10.5;
      int i = (int)f;
      

      在这个例子中,我们将浮点数10.5转换为了整数10。

    3. 十进制转其他进制:你可以使用除法和取余运算来将一个十进制数转换为其他进制。例如,下面的代码将一个十进制数转换为二进制:

      #include <stdio.h>
      void decToBinary(int n) {
       int binaryNum[32];
       int i = 0;
       while (n > 0) {
           binaryNum[i] = n % 2;
           n = n / 2;
           i++;
       }
       for (int j = i - 1; j >= 0; j--)
           printf("%d", binaryNum[j]);
      }
      

      这个函数接受一个十进制数作为输入,然后使用除法和取余运算将其转换为二进制。结果是一个数组,其中的元素是二进制数的每一位。

    4. 其他进制转十进制:你可以使用乘法和加法来将一个其他进制数转换为十进制。例如,下面的代码将一个二进制数转换为十进制:

      #include <stdio.h>
      int binaryToDec(int n) {
       int decimalNumber = 0, base = 1, remainder;
       while (n > 0) {
           remainder = n % 10;
           decimalNumber = decimalNumber + remainder * base;
           n = n / 10;
           base = base * 2;
       }
       return decimalNumber;
      }
      

      这个函数接受一个二进制数作为输入,然后使用乘法和加法将其转换为十进制。结果是一个整数,表示十进制数。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月14日
  • 已采纳回答 6月6日
  • 创建了问题 12月10日