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 - NO。
#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.为什么会这样?
答案 0 :(得分:2)
您的代码忽略了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
}