- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
欧拉计划 problem 36状态:
The decimal number, 585 = 1001001001 (binary), is palindromic in both bases.
Find the sum of all numbers, less than one million, which are palindromic in base 10 and base 2.
(Please note that the palindromic number, in either base, may not include leading zeros.)
已经有一个solution对此堆栈溢出,但我想要一个更有效的解决方案。
例如,由于回文不能有前导 0,因此不需要检查偶数,只需要检查二进制最后一位为 1 的奇数。这个简单的观察已经加速了蛮力“检查每个数字范围”乘以 2。
但我想比这更聪明。理想情况下,我想要一种算法,其运行时间与总和中的数字数量成正比。我认为没有比这更好的了。但也许这是不可能的。例如,我们能否生成所有小于一百万的回文小数,时间与满足该性质的小数数成正比? (我认为答案是肯定的)。
解决这个回文和问题的最有效算法是什么?我想考虑由 N 参数化的运行时:数字范围的大小(在本例中为 100 万), D:范围内的十进制回文集,B:范围内的二进制回文集。我希望运行时间为 o(N) + O( |D 与 B| 相交),否则为 O(min(|D|, |B|))
注意:binary的序列和 decimal回文是众所周知的。
例如二元回文 < 100: 0, 1, 3, 5, 7, 9, 15, 17, 21, 27, 31, 33, 45, 51, 63, 65, 73, 85, 93, 99
. . .十进制回文 < 100:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99,
两个碱基的回文数:0, 1, 3, 5, 7, 9, 33, 99
33和99的二进制表示分别是10001
和1100011
。下一个都是回文的数字是 585 = 1001001001
。
最佳答案
长度为2*k
的b
的回文数为(b-1)*b^(k-1)
,长度为 2*k-1
的回文数也是如此。因此,任何基数中不超过 N
的回文数为 O(sqrt(N))¹。因此,如果您在一个碱基中生成所有回文(不超过 N
)并检查它们在另一个碱基中是否也是回文,则您有一个 O(sqrt(N)*log(N)) 算法(对数因子来自回文检查)。那是 o(N),但我还不知道它是否也是 O(|D 与 B| 相交)。
这不是 O(|D 与 B| 相交) :( 只有 32 个数字最多为 1010 在两个基数中都是回文。我没有看到任何只允许构建的模式那些。
¹ 如果N
有d
位(以b
为基数),则回文数不超过N
介于最多 d-1
位的回文数和最多 d
位的回文数之间(包括两个限制)。有 (b-1)*b^(k-1)
个数字恰好有 k
个数字(在基数 b
中),其中 (b-1)*b^(floor((k-1)/2)))
是回文。求和给出最多 k
位的基数-b
回文数为 2*(b^(k/2)-1)
(如果 k
是偶数)或 (b-1)*b^((k-1)/2) + 2*(b^((k-1)/2)- 1)
(如果k
是奇数)。因此,给或取一个2*b
的因数,最多d位的回文数是b^(d/2)
。因此,不超过 N
的回文数大约为 N^0.5
,其中一个因子以所考虑的基数的倍数为界。
关于algorithm - 欧拉计划 #36 的更好解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9269495/
在编程中,我只使用整数。不过这次要进行一些计算。我需要计算Euler-Mascheroni Constant γ .最多 n 位小数。{虽然 n ∈ [30, 150]对我来说已经足够了。 [x] =
有人可以帮忙处理这段代码吗?它应该得到第 10,001 个素数。我知道 is_prime 函数可以测试一个数字是否为素数,因为我成功地利用此代码解决了上一个问题。现在我只是尝试在 for 循环中调用它
我发现了几个与这个问题相关的主题,我只是想知道为什么我的代码返回不正确的数据。所以我们必须找到第一个除数超过 500 的三角形数。详情可在此处找到:http://projecteuler.net/pr
#include int main(void) { char *num = "73167176531330624919225119674426574742355349194934"
我正在尝试投影欧拉问题 8,但是我遇到了问题。1000位数字中相邻四位的乘积最大为9×9×8×9=5832。 731671765313306249192251196744265747423553491
这是针对 Project Euler 19 的。我几乎想出了代码,但由于某种原因我的输出是 +1。 #include #define SIZE 12 int main(void) {
int main(void) { int n, div, a, b; double phi; printf("Enter n:\n"); if (scanf("%d", &n) < 1
欧拉问题: 如果我们列出所有 10 以下的自然数,它们是 3 或 5 的倍数,我们得到 3、5、6 和 9。这些倍数的和是 23。 求 1000 以下的所有 3 或 5 的倍数之和。 我试图从 pro
我知道这可能会被否决,但我真的很沮丧 24 小时,查看其他 Euler 3 线程并没有帮助我解决这个问题。有人可以帮助我的代码吗?我认为我非常接近。 function is_prime(num) {
我卡在了Question 7欧拉计划。我有这段代码。 #include int main (void) { int contador = 0, i, n, variavel = 0;
我正在尝试使用 sympy 的 idiff 函数对某些表达式执行隐式微分。 在本例中,rdot 为 dr/ds,其中 s 是仿射参数。我想对相同的仿射参数对 Ltdot、Lphidot 和 Lrdot
我正在尝试解决我的第一个项目 Euler 问题,只是为了玩 Rust,但被困在似乎需要极长计算时间的问题上 问题: https://projecteuler.net/problem=757 我想出了这
我正在学习C编程,并制定了以下算法来解决这个问题: 代码实际上有效,但最初循环只有 10 次重复(rep int main() { float p; //the power for e
我之前曾尝试暴力破解它,但没有成功。这是我的递归尝试#2(第一次使用递归方法)。请帮忙! 发生的情况是这样的:代码运行良好,数字较小,但是当我们达到一百万时,代码就会运行,并且什么也不会发生。在 Ec
Given a number find the 5 digits before the trailing 0. 9! = 362880 so f(9)=36288 10! = 3628800 so f
我是一名优秀的程序员,十分优秀!