首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用对数或其他方法从C中的任何基数转换为另一个基数[暂停]?

使用对数或其他方法从C中的任何基数转换为另一个基数[暂停]?
EN

Stack Overflow用户
提问于 2018-09-17 07:48:35
回答 1查看 0关注 0票数 0

我正在尝试编写一个C程序来将给定基数的数字转换为任何其他基数(例如,基数2二进制数到基数8,或基数3到基数16十六进制)。我对此进行了相当多的研究,并且已经阅读了类似的文章,从任何基数转换到任何基数而不通过基数10的数学?]但在给出的解释中,他们使用了一个数组,我不允许为这个程序做。

如果不使用基本转换的每种可能组合的方法编写冗长的程序,我看不出如果没有用于存储可能值的数组,这是如何可行的。我确实知道基数公式的变化与日志允许我在数字基数之间进行更改,但我不清楚我将如何应用这个,因为这个公式只给出一个十进制数答案,我仍然需要转换。

代码语言:javascript
复制
int log_base_n(int n, int logof)
{
    double logBaseN = log10((double) logof) / log10((double) n);
    return (int) ceil(logBaseN);
}

这是我的二进制到十进制转换,我试图用作中间步骤:

代码语言:javascript
复制
/**
* Convert decimal numbers to binary. Uses a greedy subtraction
* algorithm. Assumes max integer allowed is 2 to 16 power.
*
* @param numberToConvert
*/
void decToBin(int numberToConvert)
{
int power = 16;
double ans = pow(2, power);

if (numberToConvert > ans)
{
    printf("ERROR: Number too large to convert!\n");
    return;
}

while (ans > numberToConvert)
{
    power--;
    ans = pow(2, power);
}

printf("%d", 0);

int i = power;

while (i >= 0)
{

    ans = pow(2, i);
    numberToConvert = numberToConvert - ans;
    printf("%d", 1);
    i--;

    while ((pow(2, i) > numberToConvert) && (i >= 0))
    {
        printf("%d", 0);
        i--;
        ans = pow(2, i);
    }
   }
}

我知道Java有一个parseInt()方法,它可以进行基本转换,但是我可以在C中实现类似的东西,而不必像上面那样为每个可能的转换编写方法,同时仍然使用对数相关的想法吗?任何帮助将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-09-17 17:19:43

但有没有类似我可以在C中实现的东西,而不必像上面那样为每个可能的转换编写方法,同时仍然使用对数相关的想法?

对数是一个糟糕的选择。代码中的日志计算与其数学对应项的计算不完全相同,导致输出不正确。

如果商得到的值略高于整数预期值,则下面是一个问题。当然,这log10()是一个问题logof <= 0

代码语言:javascript
复制
double logBaseN = log10((double) logof) / log10((double) n);
return (int) ceil(logBaseN);

此外,计算log_base_n()是非常不必要的。

这是一个整数问题。使用整数数学。

一个简单的非数组解决方案“从任何基数转换到另一个基数” 1是使用递归。

代码语言:javascript
复制
void print_int_base(int numberToConvert, int base) {
  // For now, assume numberToConvert >= 0, 2 <= base <= 36
  if (numberToConvert >= base) {
    print_int_base(numberToConvert/base, base);
  }
  int digit = numberToConvert%base;
  int c = digit < 10 ? digit + '0' : digit + 'A';
  putchar(c);
}

测试代码

代码语言:javascript
复制
#include <stdio.h>

void print_int_base_test(int numberToConvert, int base) {
  printf("%10d %2d:", numberToConvert, base);
  print_int_base(numberToConvert, base);
  puts("");
}

int main() {
  int numberToConvert = 42;
  for (int base=2; base<=20; base++) {
    print_int_base_test(numberToConvert, base);
  }
}

产量

代码语言:javascript
复制
42  2:101010
42  3:1120
42  4:222
42  5:132
42  6:110
42  7:60
42  8:52
42  9:46
42 10:42
42 11:39
42 12:36
42 13:33
42 14:30
42 15:2M
42 16:2K
42 17:28
42 18:26
42 19:24
42 20:22

1 OP的转换理念显然是打印int各种基础。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档