无法存储过于冗长的int类型

时间:2012-12-17 10:12:56

标签: c++

考虑问题:

It can be shown that for some powers of two in decimal format like:
2^9 = 512
2^89 = 618,970,019,642,690,137,449,562,112

结果以1和2组成的字符串结尾。实际上,可以证明对于每个整数R,存在 存在2的幂,使得2K,其中K> 1。 0的最后R位数字只有1s和2s的字符串。

可以在下表中清楚地显示:

R Smallest K 2^K
1 1 2
2 9 512
3 89 ...112
4 89 ...2112

使用这种技术,那么1< = R< = 10?的所有最小K值的总和是多少?     提议的溶胶:     现在这个问题并不难解决。你可以干脆做     int temp = power(2,int) 然后,如果你能得到临时长度,那么乘以

(100^len)-i or (10^len)-i 

//我将确定你想要的最后数字。

现在这个 temp = power(2,int)随着int的增加而变得更高,你甚至无法将它存储在int类型中,甚至不能存储在long int中 .... 那会怎么做。还有其他基于位串的解决方案。我想这可能会让这个问题变得简单。 提前谢谢。

4 个答案:

答案 0 :(得分:2)

不,我怀疑是否存在任何基于"位串"的解决方案。那将是非常低效的。但是有像GMP这样的Bignum库,其特点是固定大小比int类型大得多的变量类型,或者只受内存容量限制的任意大小,加上匹配的数学运算集,与软件FPU仿真类似。 / p>

reference之后引用一句轻微的释义。

 #include <gmpxx.h>

 int
 main (void)
 {
   mpz_class a, b, c;

   a = 1234;
   b = "-5676739826856836954375492356569366529629568926519085610160816539856926459237598";
   c = a+b;
   cout << "sum is " << c << "\n";
   cout << "absolute value is " << abs(c) << "\n";

   return 0;
 }

由于C ++运算符重载,它比ANSI C版本更容易使用。

答案 1 :(得分:2)

由于您只对结果的n最低有效数字感兴趣,因此您可以尝试设计仅计算结果的算法。根据{{​​3}},您可以看到产品的n最低有效数字完全取决于被乘数的n最低有效数字。基于此,应该可以创建一个算法,计算R^K的{​​{1}}个数字,以适应long int

您可能遇到的唯一问题是,匹配序列中可能存在的数字比long int能够容纳的数字长。在这种情况下,您仍然可以使用自己的算法或库来计算其他数字。

请注意,这与大数字库的基本相同,只是您的方法可能更有效,因为您计算的数字较少,您不太可能需要。

答案 2 :(得分:1)

尝试GMP,http://gmplib.org/
如果它适合存储器,它可以存储任何大小的数字 尽管如此,你可能会用更少的蛮力方法做得更好。

答案 3 :(得分:1)

您可以在std :: bitset或std :: vector中存储二进制字符串 www.cplusplus.com/reference/bitset/bitset/

我认为bitset是你的选择。

使用大算术对2的幂进行操作不是