查找总数为1

时间:2015-06-04 10:07:39

标签: c++ c algorithm data-structures

如果数字为N,请在pow(11, N) 1 < N < 1000,000中找到1的总数。使用基本方法解决这个问题会让我们陷入溢出问题,因为N可能非常大。我们有哪些方法可以有效地解决这个问题?

2 个答案:

答案 0 :(得分:2)

请参阅Calculate count of ones in result of 11^n

乘以11等于乘以10(即将数字右边的0加上)并添加原始数字。使用它可以使用字符串,而不需要额外的库。

答案 1 :(得分:0)

这种事情是在桌面计算器dc中完成的。看看那里的bignum实现,或者只使用你最喜欢的bignum库(例如libgmp,GNU任意精度算术库)。

确保您有足够的存储空间和CPU咕噜声。观察内存使用和处理器时间如何快速增加超过11 ^ 100,000:

$ /usr/bin/time /tmp/countones 1000
105
0.00user 0.00system 0:00.00elapsed 166%CPU (0avgtext+0avgdata 760maxresident)k
0inputs+0outputs (0major+896minor)pagefaults 0swaps

$ /usr/bin/time /tmp/countones 10000
1005
0.03user 0.00system 0:00.03elapsed 102%CPU (0avgtext+0avgdata 756maxresident)k
0inputs+0outputs (0major+906minor)pagefaults 0swaps

$ /usr/bin/time /tmp/countones 100000
10190
1.12user 0.00system 0:01.12elapsed 100%CPU (0avgtext+0avgdata 1144maxresident)k
0inputs+0outputs (0major+1041minor)pagefaults 0swaps

$ /usr/bin/time /tmp/countones 1000000
104499
44.52user 0.01system 0:44.54elapsed 100%CPU (0avgtext+0avgdata 5280maxresident)k
0inputs+0outputs (0major+3992minor)pagefaults 0swaps

我的快速脚本是

dc -e "11 $1^p" | tr -d -c '1' | wc -c