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*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;iicoutResearch 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; 
     }