在这里完成菜鸟。在 C++ 中尝试这个。我正在尝试创建一个任意基数的数字数组。那就是我想定义一个新的基地,并在新基地中有这个数组“计数”。例如:base 78。我想创建一个数组,让我们说 3 个 78 基数,这样当我添加到第一个“数字”时,它会在达到 78 时溢出到第二个。类似于 [1] [ 1] [77] + 1 = [1] [2] [0]...
这可能以一种有效的方式吗?我可以这样做,让我们说一个 20 长的 base-10000 数组吗?或者计算时间会杀了我吗?
谢谢。
尝试一些类似的东西
class counter_array {
public:
static const int LEN = 20;
static const int base = 5;
counter_array operator+=(int inc) {
arr[0] += inc;
for (int i = 1; i < LEN; ++i) {
int old = arr[i];
arr[i] += arr[i-1] / base;
arr[i-1] %= base;
if (arr[i] == old) {
break;
}
}
}
private:
int arr[len];
};
我没有做任何调试,但你应该明白这一点。
在内部(至少在所有现代机器和所有支持 C 或 C++ 的机器上),整数值是二进制的。其他基地仅用于输入和输出。内部操作,如计数,是“基本独立的”,因为它们取决于值及其表示方式。
问题是long long
(至少 64 位)是否足够大。如果是这样,您只需要为其提供转换例程即可。(strtoll
最多支持 36 个基数,但没有相应的输出例程。)如果没有,您将需要实现一个更大的整数类型,使用 Knuth 的算法来处理四个基本运算符。并且您需要为输入和输出提供转换例程(一旦您掌握了四个基本操作就很容易了)。
当然,您可以使用任何基础来实现较长的整数类型;传统上,出于效率原因,已使用基数 2^n,其中 n 是可用的机器字长,但没有什么可以阻止您使用基数 10000 或任何适合其中一个机器字的基数。您的数字将只需要更多内存(因此需要更多时间);算法是相同的(Knuth 中的那些)。