该程序需要输入一个任意大的无符号整数,表示为一个以10为底的字符串。输出是另一个以16为底表示整数的字符串。
例如,输入为“1234567890987654321234567890987654321234567890987654321”,输出应为“CE 3B 5A 137 DD 015278 E09864703 E4 FF 9952 FF 6 B62 C1 CB 1”
算法越快越好。
如果输入被限制在32位或64位整数内,这将是非常容易的;例如,下面的代码可以进行转换:
#define MAX_BUFFER 16
char hex[] = "0123456789ABCDEF";
char* dec2hex(unsigned input) {
char buff[MAX_BUFFER];
int i = 0, j = 0;
char* output;
if (input == 0) {
buff[0] = hex[0];
i = 1;
} else {
while (input) {
buff[i++] = hex[input % 16];
input = input / 16;
}
}
output = malloc((i + 1) * sizeof(char));
if (!output)
return NULL;
while (i > 0) {
output[j++] = buff[--i];
}
output[j] = '\0';
return output;
}
字符串
真实的具有挑战性的部分是“任意大”的无符号整数。我在谷歌上搜索过,但大多数人都在谈论32位或64位内的转换。没有找到运气。
任何人都可以给予任何点击或任何链接,可以阅读?
先谢谢你。
编辑这是我最近遇到的一个面试问题。谁能简单地解释一下如何解决这个问题?我知道有一个gmp库,我以前用过它;然而,作为面试问题,它要求不使用外部库。
8条答案
按热度按时间vkc1a9a21#
1.分配一个整数数组,元素的数量等于输入字符串的长度。将数组初始化为全0。
这个整数数组将以16为底存储值。
1.将输入字符串中的十进制数字添加到数组的末尾。将现有值乘以10加上结转,将新值存储在数组中,新结转值为newvalue div 16。
字符串
1.打印数组,从第0个条目开始,跳过前导0。
下面是一些可以工作的代码。毫无疑问,可能有一些优化可以进行。但这应该足以作为一个快速和肮脏的解决方案:
型
zzoitvuj2#
我写了一个article,它描述了一个简单的Python解决方案,可以用来将一系列数字从任意数字基转换为任意数字基。我最初用C实现了这个解决方案,我不想依赖于外部库。我认为你应该能够用C或任何你喜欢的语言重写非常简单的Python代码。
下面是Python代码:
字符串
vecaoik13#
真实的具有挑战性的部分是“任意大”的无符号整数。
你试过使用GNU MP Bignum库吗?
vc6uscn94#
Unix
dc
能够对任意大整数进行基转换。开放BSD源代码是可用的here。0vvn1miw5#
下面是一个BigInt库:
字符串
不知道它是否有效,但这是我在谷歌上找到的第一个。它似乎有解析和格式化大整数的函数,所以它们也可能支持不同的基。
**编辑:**啊,你用的是C,我的错误。但是您可能能够从代码中获得一些想法,或者使用.NET的人可能会有同样的问题,所以我将把它留在这里。
iezvtpos6#
你可以尝试这个任意长度的input C99base_convert(介于2和62之间)函数:
字符串
在线试用-使用示例:
型
示例输出:
型
使用您的示例和Fibonacci(1500000)进行了测试。
谢谢。
e4yzc0pl7#
Python皮:
字符串
hjzp0vay8#
下面是上面提到的用JavaScript实现的算法:
字符串