【问题标题】:Counting numbers that have three different prime factors计算具有三个不同质因数的数字
【发布时间】:2016-05-12 14:45:30
【问题描述】:

numbers.txt 中有 1000 个数字,每个数字 2 到 9 位,每个数字单独一行。练习是计算有多少个数满足条件:分解后,这个数正好有 3 个不同的质因数,它们可以出现多次,而且都是偶数。

例如 105 - 因素:3, 5 ,7 - 是, 1287 - 因素:3、3、11、13 - 是,

1157625 - 因素:3,3,3,5,5,5,7,7,7 - 是,

55 - 因素:5、11 - 否。

#include <iostream>
#include <fstream>
using namespace std;
int number, threefnumbers=0;
int main()
{
  ifstream file("numbers.txt");
  ofstream outputf("results.txt");
  int count_factors;
  while (file >> number)
  {
    count_factors=0;
    int factor=3;
    if (number%2!=0)
    {
       while (number>1)
       {
        if (number%factor==0)
          count_factors++;
        while (number%factor==0)
        {
          number=number/factor;
        }
        factor+=2;
       }
       if (count_factors==3) threefnumbers++;
     }
  }

  outputf << "59.1) " << endl << threefnumbers;

  file.close();
  outputf.close();
  return 0;
}

我从 numbers.txt 中知道,有很多数字满足条件,但程序只返回 1。为什么会这样?

【问题讨论】:

  • “它们都是偶数”。您的示例数字都不是偶数!
  • 不可能有偶数。素数总是奇数。
  • @A.Wabbi 2 是质数
  • 题外话:节省大量计算并查找埃拉托色尼筛。缓存并重用结果。
  • @A.Wabbi 因子 将是素数(因此,除了 2,是奇数);被测试和分解的数字当然可以是偶数(或奇数)。

标签: c++ primes


【解决方案1】:

您的代码忽略了 2 是质数这一事实。您需要检查读入的数字是否可以减少 2。您可以使用如下所示的方法来做到这一点:

while(read number)
{
    int factor_count = 0;
    // check 2 by itself
    if (number % 2 == 0)
    {
        factor_count++;
        while(number % 2 == 0)
            number /= 2;
    }
    for (int factor = 3; factor < number; factor += 2)
    {
        if (number % factor == 0)
        {
            factor_count++;
            while(number % factor == 0)
                number /= factor;
        }
    }
    if(factor_count == 3)
        do something
}

可以通过制作一个质数列表来提高效率,该列表可以达到文件中可能的最大数字,在这种情况下为 999,999,999。然后,您可以遍历该素数列表,直到用完素数。那看起来像

std::vector<int> primes = get_prime_list(999999999);  
// returns a list of all prime numbers less than the number passed in.
// leaving it to you to implement but a Sieve of Eratosthenes should work well
while(read number)
{
    int factor_count = 0;
    for(auto e : primes)
    {
        if (number % e == 0)
        {
            factor_count++;
            while(number % e == 0)
                number /= e;
        }
        if (number == 1) // number is fully factorized
            break;
    }
    if(factor_count == 3)
        do something
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多