欧拉项目 #3 的这段代码有什么问题
What is wrong with this code for Project Euler #3?
#include <iostream>
using namespace std;
int prim( long long x ) {
int s = 0;
for( long long i = 1; i <= x ; i++ ) {
if( x % i == 0 ) {
s++;
}
}
if( s == 2 ) {
return 1;
}
return 0;
}
int main() {
long long A = 600851475143;
long long i = 2;
long long C = 0;
while( i < (A/2) ) {
while( A % i == 0 ) {
A = A / i;
if( i > C ) {
C = i;
}
}
i++;
}
if( prim(C) ) {
cout<<C;
}
return 0;
}
这是我为欧拉项目问题 3 编写的代码。我不明白为什么当我运行它时,它给了我 1471。这是一个很好的答案,但不是最大的答案。但是如果我更改i = 1471
它会给我正确的答案 6857 ...问题出在哪里?为什么它不"自动"给我 6857 的好答案,而是 1471 当我从 2 开始时?
附言。我知道我不必在任何地方都使用long long
。
你的因式分解算法需要在C
和A
之间进行选择,因为在过程结束时A
包含余数,这也是原始A
的一个因素。如果它恰好是最大的一个,你的代码就会错过它。
if (A > C) {
C = A;
}
进行此修改后,代码将生成正确答案(演示)。
注意:现在您的程序正在运行,您可以考虑进行一些修改:
- 尝试潜在的除数直到你达到
A/2
是低效的;你可以停在平方根(你明白为什么吗?)
在 - 构建程序的方式中不需要检查素数
- 通过尝试所有数字来检查素数,即数学定义的方式,效率非常低:你正在尝试太多保证不起作用的除数。同样,您可以在平方根处停止。如果你从 2 开始,而不是从 1 开始,在平方根处停止,并且没有发现除数,则数字是素数。
相关文章:
- 在黑客地球上没有获得以下C ++代码问题的输出
- VS 代码C++问题
- 插入操作的二叉搜索树代码问题
- 如何在代码问题中解决此问题 代码强制
- 发送和十六进制消息时套接字代码C++问题
- 代码问题将字符串转换为图表执行
- C 代码问题?编译器问题?代码块
- 代码问题.使用矢量删除相同的数字,除了它的最后一个入口
- 迭代列表以查找元素的出现.代码问题
- 使用JNI从Java调用本机(C++)函数时发生访问冲突:这是我的代码问题,还是已知问题
- XCode 4.5简单的OpenGL C 代码问题
- 在VS 2010上使用boost::interprocess生成代码问题
- 简单代码问题-未定义标识符
- 基本的c++代码问题
- 识别C++代码问题
- C++角色战斗代码问题
- OpenScenegraph 示例代码问题
- PortAudio示例代码问题
- 关于cout和cin的c++简单代码问题
- 关于歧义排列的代码问题