0

在这里完成菜鸟。在 C++ 中尝试这个。我正在尝试创建一个任意基数的数字数组。那就是我想定义一个新的基地,并在新基地中有这个数组“计数”。例如:base 78。我想创建一个数组,让我们说 3 个 78 基数,这样当我添加到第一个“数字”时,它会在达到 78 时溢出到第二个。类似于 [1] [ 1] [77] + 1 = [1] [2] [0]...

这可能以一种有效的方式吗?我可以这样做,让我们说一个 20 长的 base-10000 数组吗?或者计算时间会杀了我吗?

谢谢。

4

2 回答 2

0

尝试一些类似的东西

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];
};

我没有做任何调试,但你应该明白这一点。

于 2013-10-22T08:54:56.157 回答
0

在内部(至少在所有现代机器和所有支持 C 或 C++ 的机器上),整数值是二进制的。其他基地仅用于输入和输出。内部操作,如计数,是“基本独立的”,因为它们取决于值及其表示方式。

问题是long long(至少 64 位)是否足够大。如果是这样,您只需要为其提供转换例程即可。(strtoll最多支持 36 个基数,但没有相应的输出例程。)如果没有,您将需要实现一个更大的整数类型,使用 Knuth 的算法来处理四个基本运算符。并且您需要为输入和输出提供转换例程(一旦您掌握了四个基本操作就很容易了)。

当然,您可以使用任何基础来实现较长的整数类型;传统上,出于效率原因,已使用基数 2^n,其中 n 是可用的机器字长,但没有什么可以阻止您使用基数 10000 或任何适合其中一个机器字的基数。您的数字将只需要更多内存(因此需要更多时间);算法是相同的(Knuth 中的那些)。

于 2013-10-22T09:05:52.573 回答