【发布时间】:2017-12-28 22:39:57
【问题描述】:
我有一个字节数组和该数组的长度。目标是输出包含以 10 为底数的数字的字符串。
我的数组是小端的。这意味着第一个 (arr[0]) 字节是最低有效字节。这是一个例子:
#include <iostream>
using namespace std;
typedef unsigned char Byte;
int main(){
int len = 5;
Byte *arr = new Byte[5];
int i = 0;
arr[i++] = 0x12;
arr[i++] = 0x34;
arr[i++] = 0x56;
arr[i++] = 0x78;
arr[i++] = 0x9A;
cout << hexToDec(arr, len) << endl;
}
该数组由[0x12, 0x34, 0x56, 0x78, 0x9A] 组成。我要实现的函数hexToDec 应该返回663443878930,这是十进制的数字。
但是,问题是因为我的机器是32位,所以它输出2018915346(注意这个数字是从整数溢出获得的)。所以,问题是因为我使用的是幼稚的方式(迭代数组并将其乘以256 到数组中位置的幂,然后乘以该位置的字节,最后添加到总和)。这当然会产生整数溢出。
我也试过long long int,但在某些时候,当然会发生整数溢出。
我想表示为十进制数的数组可能很长(超过 1000 个字节),这肯定需要比我天真的算法更聪明的算法。
问题
实现这一目标的好算法是什么?另外,我必须问的另一个问题是该算法的最佳复杂度是多少?可以在线性复杂度O(n) 中完成,其中n 是数组的长度?我真的想不出一个好主意。实施不是问题,是我缺乏想法。
建议或想法如何做到这一点就足够了。但是,如果使用一些代码更容易解释,请随意用 C++ 编写。
【问题讨论】:
-
您可能会在使用 bigint 库/类时找到帮助,使用您最喜欢的搜索引擎。
-
@Yunnosch。我的目标是从头开始实现它,而不是使用内置库或类。 C++ 只是一个示例语言,我对算法很感兴趣。
-
艰难,我希望是为了学习,而不是为了解决更大的问题。我认为“像在学校用铅笔和纸教的那样划分”将是“一种”算法。可能不是最好的......即根据数组大小的知识(即 16 的幂),找到高于您要查找的值的 10 的最低幂,然后得到除以下一个较低的 10 幂的余数。重复。
-
@Yunnosch。 “找到 10 的最低幂,它高于您要查找的值” - 这不会导致整数溢出吗?
-
如果您使用指数,则不会。对于其他所有内容,您需要保持在 byte 的数据类型数组中。 IE。对值使用字节数组的查找表(或在确定指数后即时生成它们)。
标签: c++ arrays algorithm memory hex