【发布时间】:2016-04-30 02:40:00
【问题描述】:
这是一个关于 Project Euler 问题的问题。 在这里您可以找到问题的描述:https://projecteuler.net/problem=29
好的,首先,让我澄清一下我已经解决了这个问题,我只是在寻找一个更基于数学的替代解决方案。
第二,为了不给没有解决的人破坏问题,还没有解决的请不要继续。 :)
所以,我使用 Python 解决了这个问题,并且因为它支持大数字和列表推导,我能够想出一个单行:
print(len(set([a ** b for a in range(2, 101) for b in range(2, 101)])))
现在,我正在尝试通过使用更多数学知识在 C 中解决它(C 本身不支持大数字或列表推导)。 我遇到了这个线程:PROJECT EULER #29 接受的答案给了我一些想法,我想出了这个代码:
int main(void) {
int found[1000]; // an array where I hold the found values(0 or 1)
int e, b, i, count, x;
count = 0; // number of duplicates
x = 3;
for(i = 0; i < 1000; i++)
found[i] = 0;
for(e = 1; (int)pow(x, e) <= 100; e++) {
for(b = 2; b <= 10; b++) {
if(found[e * b]) // if the value has been found, then we have duplicate
count++;
found[e * b] = 1; // mark that we found the value
}
}
printf("count: %d\n", count);
return 0;
}
使用此代码,我正在做您在答案底部看到的事情
上面,他展示了一些关于如何找到重复项的图表
x = 3,根据他之前的解释。我正在尝试做同样的事情。现在,如果你运行我的代码,
根据上述答案的图表,它正确输出 13,即重复数。
所以,我尝试扩展它来解决实际的项目欧拉问题,因为如果我能够找到重复的数量,那么我只需从数字 99 * 99 中减去它(这是可能的功率组合,因为 2
int main(void) {
int found[1000];
int e, b, i, count, x;
count = 0;
for(x = 2; x <= 100; x++) {
for(i = 0; i < 1000; i++)
found[i] = 0;
for(e = 1; (int)pow(x, e) <= 100; e++) {
for(b = 2; b <= 100; b++) {
if(found[e * b])
count++;
found[e * b] = 1;
}
}
}
printf("count: %d\n", count);
return 0;
}
如果你注意的话,变化是我循环了从 2 到 100 的所有 xs,而 b 不是从 2 到 10,而是从 2 到 100。
但是,程序会打印 814,这是不正确的。应该是618。
非常感谢任何帮助!我可能计算了两次重复,但是在哪里?代码有什么问题?另外,如果您有任何有助于构建新算法的数学解释,我们也非常感谢!
编辑:
我忘了提到的是,如果不是把:for(x = 2; x <= 100; x++)
我愿意:for(x = 2; x <= 6; x++)
即停到6,它会打印正确的答案。这更离奇。
EDIT2:
我还要注意,对于 8 和 9(而不是 100),它给出了正确的结果。分别为 44 和 54。
【问题讨论】:
-
如果你想改进工作代码,你应该传递给codereview.stackexchange.com :)
-
谢谢,我会考虑的!只是这并没有真正起作用,因为它会产生错误的结果。
-
我是用和你一模一样的单线做的。但是,如果您想要一种更数学的方法,您可以在完全不计算幂的情况下做到这一点。例如,64 可以写成 43 和 82,因为 26 = (23)**2 = (2**2)**3。也就是说,我们写出 6 = 3*2 = 2*3 并使用指数定律。当然,这适用于任何基数,而不仅仅是 2,而且对于任何指数,您都可以考虑不同的因素。现在您必须担心重复计算。
-
是的,如果您看到我上面提到的线程,这就是他提到的内容,根据他的回答,我试图解决问题。正如您所说,基本问题是重复计算。 :)
-
每次
count递增时,尝试打印出 x、e、b。然后你可以看到你在数什么。
标签: python c algorithm math combinatorics