最大的Prime因子-C ++

时间:2011-08-15 07:07:41

标签: c++ prime-factoring

我正在尝试找到数字600851475143的最大素数因子。我的代码适用于我测试的较小数字(低于100)。但是当面对600851475143时,它返回4370432,绝对不是素数。任何想法我的代码可能出错?

#include <iostream>
#include <time.h>
#include <math.h>

using namespace std;

int main()
{

int num;
int largest;
int count;

cout<<"Please enter a number to have its Largest Prime Factor found"<<endl;
cin>>num;
num = 600851475143;

for (int factor = 1; factor <= num; factor++)
{
    if (num % factor == 0)
    {
        count = 0;
        for (int primetest=2; count == 0 && factor > primetest ; primetest++) 
        {
            if (factor % primetest == 0)
            count ++;    
            //endif
        }
        if (count == 0)
        largest = factor;
        //endif
    }       

}//endif
cout<<largest<<endl;
system("PAUSE");
}

4 个答案:

答案 0 :(得分:4)

num = 600851475143;

此处发生整数溢出。 num的大小不足以包含您提供的值。

使用uint64_t

#include <cstdint>  //must include this!

uint64_t num = 600851475143;

阅读本文:cstdint

答案 1 :(得分:4)

代码存在很多主要问题,所以我希望显示更好的完整版 解。主要问题是它没有输入验证!好的代码必须是正确的 在所有输入上它不会拒绝。所以我现在已经包含了正确的阅读和验证 输入。通过这种方式,您可以自动解决问题。

所有主要类型都需要有专有名称!所以我介绍了typedef uint_type。 如果输入60085147514,编译器也将在编译时找到 有效与否(虽然现在也在运行时被拒绝)。如果编译器发出警告, 那么你需要使用更大的整数类型;然而,无符号长度就足够了 64位平台(但不适用于常见的32位平台)。如果你需要更大的整数类型, 那么现在只需改变一个地方。

你的算法非常低效!所需要的只是将数字除以 找到所有因素(尽可能长),并保证只会遇到素数 数字 - 所以不需要检查。而且只需要考虑因素 输入的平方根。这一切都需要一些逻辑思考 - 请参阅 代码。

然后你的代码违反了局部性原则:声明你的变量所在的位置 需要,而不是其他地方。您还包括非C ++标头,此外还有 不需要。 use-directives的使用只会混淆代码:你再也看不到了 组件来自哪里;而且没有必要!我还介绍了一个 匿名命名空间,用于更突出的定义。

最后,我使用更紧凑的编码风格(缩进2个空格,括号上的 同一条线,尽可能避免使用括号。想一想:通过这种方式你可以看到很多 更一目了然,通过一些培训,它也更容易阅读。

如图所示编译时,编译器会警告可能使用undefined的largest_factor。 事实并非如此,我选择将此警告视为空。

Program LargestPrimeFactor.cpp:
// Compile with
// g++ -O3 -Wall -std=c++98 -pedantic -o LargestPrimeFactor LargestPrimeFactor.cpp

#include <string>
#include <iostream>

namespace {
  const std::string program_name = "LargestPrimeFactor";
  const std::string error_output = "ERROR[" + program_name + "]: ";
  const std::string version_number = "0.1";

  enum ErrorCodes { reading_error = 1, range_error = 2 };
  typedef unsigned long uint_type;
  const uint_type example = 600851475143; // compile-time warnings will show
  // whether uint_type is sufficient
}

int main() {

  uint_type number;
  std::cout << "Please enter a number to have its largest prime factor found:"
   << std::endl;
  std::cin >> number;
  if (not std::cin) {
    std::cerr << error_output << "Number not of the required unsigned integer"
     " type.\n";
    return reading_error;
  }
  if (number <= 1) {
    std::cerr << error_output << "Number " << number << " has no largest prime"
     " factor.\n";
    return range_error;
  }
  const uint_type input = number;

  uint_type largest_factor;
  for (uint_type factor = 2; factor <= number/factor; ++factor)
    if (number % factor == 0) {
      largest_factor = factor;
      do number /= factor; while (number % factor == 0);
    }
  if (number != 1) largest_factor = number;

  std::cout << "The largest prime factor of " << input << " is " << largest_factor
   << ".\n";
}

答案 2 :(得分:0)

并提供更正。根据您的编译器,您可以尝试unsigned long,看看是否可以保留您的答案。尝试并写入cout,看看变量是否包含您期望的值。

另一方面,如果你试图找到最大的因子,从最高可能因素倒计时效率会不是更高效吗?

答案 3 :(得分:0)

您可以将 num 变量声明为 long long int

long long int num;

这样可以避免代码中出现所有类型的溢出!