【问题标题】:Project Euler 3 - Highest Prime FactorProject Euler 3 - 最高质因数
【发布时间】:2011-11-18 02:04:46
【问题描述】:

在开始之前,我想澄清一下,我不是寻找代码示例来获得答案;这将击败欧拉计划的对象。

问题可以在这里找到http://projecteuler.net/problem=3

我想我有办法解决这个问题,但是算法很慢;它已经运行了将近两个半小时。所以我正在寻找关于优化的一般建议。

谢谢。

#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;
    }
  }
}

【问题讨论】:

  • 研究Erosthanes的筛子。您查看的值过多。
  • 感谢您的提示。我正要读一读。
  • 您的素数函数对于大于 2 的每个奇数返回 true。对于每个 2 及以下的数字,它什么也不返回。
  • 为了优化 this 代码:在primality 中,您可以将num 除以二,就像在main 中一样。
  • primality 仅适用于 int,但您将 long long 传递给它,这不起作用

标签: c++


【解决方案1】:

如果您从 2 开始 div 并向上计数而不是向下计数,并在模数为零时将其与数字相除,您将获得两个有用的优势:

  1. 您不必检查 div 是否为素数,因为它不能是合数,因为任何小于它的素数都已经被除掉了。
  2. 每次找到一个因数时,您都会减小剩余问题的大小,而且事实证明,输入数的质因数相当小。

你也可以在div*div 大于剩余数字时打破,因为你知道它必须是一个素数。这是因为任何大于平方根的除数都与小于平方根的除数“配对”。但是,由于这是一个“简单”的问题,所以这里不需要这种优化(尽管它对以后的问题很有用)。

【讨论】:

  • 是的。如果您实现第一段,您应该能够将运行时间缩短到不到一秒。
  • 谢谢,我正在处理这个问题。不过需要一点时间;很累。
【解决方案2】:
# 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; 
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多