C++ 计算具有三个不同素数因子的数

C++ 计算具有三个不同素数因子的数,c++,primes,C++,Primes,在numbers.txt中有1000个数字,每个数字有2到9个数字,每个数字在一个单独的行中。练习是计算有多少个数字,这就满足了条件:当分解时,这个数字正好有3个不同的素数因子,它们可以出现几次,它们都是偶数 比如说 105-因素:3、5、7-是, 1287-因素:3、3、11、13-是 1157625-因素:3,3,3,5,5,5,7,7-是 55-因素:5、11-无 #include <iostream> #include <fstream> using namesp

在numbers.txt中有1000个数字,每个数字有2到9个数字,每个数字在一个单独的行中。练习是计算有多少个数字,这就满足了条件:当分解时,这个数字正好有3个不同的素数因子,它们可以出现几次,它们都是偶数

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

1157625-因素:3,3,3,5,5,5,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;
}
#包括
#包括
使用名称空间std;
整数,三位数=0;
int main()
{
ifstream文件(“numbers.txt”);
流输出函数(“results.txt”);
整数计数因子;
while(文件>>编号)
{
计数系数=0;
整数因子=3;
如果(编号%2!=0)
{
而(数量>1)
{
如果(数字百分比因子==0)
计数因子++;
而(数字百分比因子==0)
{
数字=数字/系数;
}
因子+=2;
}
如果(count_factors==3)三个数字++;
}
}

outputf您的代码忽略了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
}
while(读取编号)
{
整数因子_计数=0;
//单独检查2
如果(数字%2==0)
{
因子_计数++;
而(数字%2==0)
数目/=2;
}
对于(整数系数=3;系数<数字;系数+=2)
{
如果(数字百分比因子==0)
{
因子_计数++;
而(数字百分比因子==0)
数字/=系数;
}
}
如果(因子_计数=3)
做点什么
}
通过创建一个素数列表,使其达到文件中可能的最大值(在本例中为99999999),可以提高整个过程的效率。然后,您可以迭代该素数列表,直到用完素数因子。这类似于

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
}
std::vector primes=get_prime_list(99999999);
//返回小于传入数字的所有素数的列表。
//把它留给你去实现,但是一个埃拉托斯烯的筛子应该可以很好地工作
while(读取数字)
{
整数因子_计数=0;
用于(自动e:素数)
{
如果(编号%e==0)
{
因子_计数++;
而(编号%e==0)
数字/=e;
}
如果(number==1)//数字已完全分解
打破
}
如果(因子_计数=3)
做点什么
}

“它们都是偶数”。您的示例数字中没有一个是偶数!不可能有偶数。素数总是奇数。@A.Wabbi 2是素数of topic:节省大量计算并查找Eratosthenes筛。缓存并重用结果。@A.Wabbi因子将是素数(因此,保存为2,则为奇数);被测试和分解的数字当然可以是偶数(或奇数)。