1

考虑问题:

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

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

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

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) ,然后如果你能得到 temp 的长度,然后将它乘以

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

// 我会在哪里确定你想要多少最后一位数字。

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

4

4 回答 4

2

不,我怀疑是否有任何基于“位串”的解决方案。那将是非常低效的。但是有像GMP这样的 Bignum 库,它的特点是变量类型要么是比 int 类型大得多的固定大小,要么是仅受内存容量限制的任意大小,加上匹配的数学运算集,其工作方式类似于软件 FPU 仿真。

引用后引用一个小的释义。

 #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 版本更易于使用。

于 2012-12-17T10:21:17.397 回答
2

由于您只对n结果的最低有效数字感兴趣,因此您可以尝试设计一种仅计算这些数字的算法。根据书面乘法的标准算法,您可以看到乘积的n最低有效数字完全由n被乘数的最低有效数字决定。基于此,应该可以创建一个算法来计算尽可能多的R^K数字long int

您可能会遇到的唯一问题是,可能有以匹配序列结尾的数字比 along int可以容纳的更长。在这种情况下,您仍然可以使用自己的算法或库来计算额外的数字。

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

于 2012-12-17T10:34:58.753 回答
1

试试 GMP,http
://gmplib.org/ 如果它适合内存,它可以存储任意大小的数字。
尽管如此,使用较少的蛮力方法可能会更好。

于 2012-12-17T10:18:42.913 回答
1

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

我认为 bitset 是你的选择。

对 2 的幂的运算使用大算术虽然不是

于 2012-12-17T10:19:59.607 回答