C++ 项目Euler 3-最高基本因子
在开始之前,我想澄清一下,我不是在寻找代码示例来获得答案;这将挫败欧拉计划的目标 问题可以在这里找到 我想我有办法解决这个问题,但是算法很慢;它已经运行了将近两个半小时了。因此,我正在寻找关于优化的一般建议 谢谢C++ 项目Euler 3-最高基本因子,c++,C++,在开始之前,我想澄清一下,我不是在寻找代码示例来获得答案;这将挫败欧拉计划的目标 问题可以在这里找到 我想我有办法解决这个问题,但是算法很慢;它已经运行了将近两个半小时了。因此,我正在寻找关于优化的一般建议 谢谢 #include<iostream> using namespace std; bool primality(int); int main(){ long long lim = 600851475143; long long div = lim/2; bo
#include<iostream>
using namespace std;
bool primality(int);
int main(){
long long lim = 600851475143;
long long div = lim/2;
bool run = true;
while(run){
if(lim%div==0 && primality(div)){
cout << "HPF: " << div;
run = false;
}
else{
div--;
}
if(div<=1){
break;
}
}
return 0;
}
bool primality(int num){
for(int i=2; i<num; i++){
if(num%i==0 && i!=num){
return false;
}
else{
return true;
}
}
}
#包括
使用名称空间std;
布尔素性(int);
int main(){
long-long lim=600851475143;
长div=lim/2;
bool run=true;
while(运行){
if(lim%div==0&&素性(div)){
cout如果您从2开始,向上计数而不是向下计数,并在模为零时将其从数字中除掉,您将获得两大优势,在这里非常有用:
您不必检查div是否为素数,因为它不能是复合的,因为任何小于它的素数因子都已经被划分出来了
每次你找到一个因子,你就会减少剩下的问题的大小,而且,事实证明,输入的数字有相当小的素数因子
然后,您还可以中断一次div*div
大于剩余的数字,因为此时您知道它必须是素数。这是因为任何大于平方根的除数都与小于平方根的除数“配对”。然而,由于这是一个“容易”的问题,这里不需要进行此优化(尽管它对以后的问题很有用)。如果从2开始计算div
,然后向上计数而不是向下计数,并在模为零时将其从数字中除掉,则可以获得两大优势:
div*div
大于剩余的数字,因为此时您知道它必须是素数。这是因为任何大于平方根的除数都与小于平方根的除数“配对”。然而,由于这是一个“容易”的问题,这里不需要进行此优化(虽然它对以后的问题很有用)。#可能的解决方案,但它仍然*耗时*但答案可以通过控制台输出中的最后一个选项猜测出来
#包括
#包括
#包括
#包括
整数素数(无符号长);
使用名称空间std;
int main(){
无符号long-longⅡ,ij;无符号long-long-in;
cin>>in;ij=ceil(in/2);
如果((ij%2)=0)ij-=1;
对于(ii=3;ii#可能的解决方案,但仍然是“耗时的”,但答案可以通过控制台输出中的最后一个选项猜测
#包括
#包括
#包括
#包括
整数素数(无符号长);
使用名称空间std;
int main(){
无符号long-longⅡ,ij;无符号long-long-in;
cin>>in;ij=ceil(in/2);
如果((ij%2)=0)ij-=1;
对于(ii=3;ii coutResearch the siever of Erosthanes.你看到的值太多了。谢谢你的提示。我正要读一读。你的素数函数对于2以上的每一个奇数都返回true。对于2及以下的每一个数字,它都不返回任何值。要优化此代码:在素数中,你可以先将num
除以2,就像你在main
中一样。素数只对int有效,但你要向它传递长的long,这不起作用。研究Erosthanes的筛选。你看到的值太多了。谢谢你的提示。我正要读一读。素数函数对于2以上的每一个奇数都返回true。对于2及以下的每一个数字,它都返回truens无。优化此代码:在primarity
中,您可以将num
除以二开始,就像您在main
中一样。primarity只对int有效,但您要向它传递长long,这是行不通的。如果您实现第一段,您应该能够将运行时间缩短到不到一秒。Thanks,我正在做这个。虽然花了一点时间;很累。是的。如果你实现了第一段,你应该能够将运行时间缩短到不到一秒钟。谢谢,我正在做这个。虽然花了一点时间;很累。
# Possible solution but still its *time consuming* but answer can be guessed by the last option in console output
#include<stdio.h>
#include<string>
#include<iostream>
#include<math.h>
int prime(unsigned long long);
using namespace std;
int main(){
unsigned long long ii, ij; unsigned long long in;
cin>>in; ij = ceil(in/2);
if( (ij % 2) == 0 ) ij -= 1;
for(ii = 3 ;ii < ij;ii+= 2){
if(in % ii == 0){
if(prime(ii) == 1 ){
cout<<" ans "<<ii<<endl;
}
}
}
return 0;
}
int prime(unsigned long long ii){
unsigned long long ij;
for(ij = 3;ij < ii/2 ;ij += 2){
if( (ii % ij) ==0){
return 0;
}
}
return 1;
}