我正在尝试编写一个C程序来将给定基数的数字转换为任何其他基数(例如,基数2二进制数到基数8,或基数3到基数16十六进制)。我对此进行了相当多的研究,并且已经阅读了类似的文章,从任何基数转换到任何基数而不通过基数10的数学?]但在给出的解释中,他们使用了一个数组,我不允许为这个程序做。
如果不使用基本转换的每种可能组合的方法编写冗长的程序,我看不出如果没有用于存储可能值的数组,这是如何可行的。我确实知道基数公式的变化与日志允许我在数字基数之间进行更改,但我不清楚我将如何应用这个,因为这个公式只给出一个十进制数答案,我仍然需要转换。
int log_base_n(int n, int logof)
{
double logBaseN = log10((double) logof) / log10((double) n);
return (int) ceil(logBaseN);
}
这是我的二进制到十进制转换,我试图用作中间步骤:
/**
* 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中实现类似的东西,而不必像上面那样为每个可能的转换编写方法,同时仍然使用对数相关的想法吗?任何帮助将不胜感激。
发布于 2018-09-17 17:19:43
但有没有类似我可以在C中实现的东西,而不必像上面那样为每个可能的转换编写方法,同时仍然使用对数相关的想法?
对数是一个糟糕的选择。代码中的日志计算与其数学对应项的计算不完全相同,导致输出不正确。
如果商得到的值略高于整数预期值,则下面是一个问题。当然,这log10()
是一个问题logof <= 0
。
double logBaseN = log10((double) logof) / log10((double) n);
return (int) ceil(logBaseN);
此外,计算log_base_n()
是非常不必要的。
这是一个整数问题。使用整数数学。
一个简单的非数组解决方案“从任何基数转换到另一个基数” 1是使用递归。
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);
}
测试代码
#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);
}
}
产量
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
各种基础。
https://stackoverflow.com/questions/-100006129
复制相似问题