Вот код:
#include <iostream>
#include <ctype.h>
#include <iomanip>using namespace std;
class Project3
{
public:
void factorcalc()
{
while (i<5000000){
++i;
factor = prime/i;
if (factor == (long long int)factor){
//if (modf(primeoverthree, 0) == 0){
cout << "Factor is: " << setprecision(12) << factor << endl;
cout << "Denominator is: " << setprecision(12) << i << endl;
++x;
factorarray[x] = factor;
}
else{/*empty else statement*/}
}
}
void displayfactorresults ()
{
for (x=0; x<9; ++x)
if (factorarray[x]%2 == 0 && factorarray[x]%3 == 0 && factorarray[x]%5 == 0 && factorarray[x]%7 == 0){
cout << factorarray[x] << setprecision(12) << endl;
}
}
private:
long double factor = 1;
long double prime = 600851475143;
long double i = 0;
int x = 0;
long double factorarray[9];
};int main() {
Project3 Pro3;
Pro3.factorcalc();
Pro3.displayfactorresults();
return 0;
}
Код в ответ на Проект 3 на projecteuler.net. Я пытаюсь найти самый большой главный фактор 600851475143, используя базовые знания C ++ & здравый смысл.
Ошибка происходит в void displayfactorresults
функция.
Компилятор выводит сообщение об ошибке:
«недопустимые операнды для двоичного выражения ‘long-double’ & ‘Длинный двойной»
%
Оператор остаток может быть применен только к целочисленным операндам.
factorarray[x]
имеет тип long double
тип с плавающей точкой.
Либо использовать fmod
функция (следите за ошибками округления!) или преобразуйте операнды в целочисленный тип.
Или, еще лучше, сделать factorarray
во-первых, массив некоторого достаточно большого целочисленного типа. Вы уже предполагаете, что значения могут быть преобразованы в long long int
, Преобразование чего-либо в желаемый тип обычно не так хорошо, как использование нужного типа.
factorarray
массив парных чисел Вы не можете использовать по модулю (%
) на double
, Либо преобразовать его в массив int
или приведите элемент массива, прежде чем использовать его ((int)factorarray[x]) % 2 == 0
factorarray[x] % 2 == 0
(double type% 2 == 0) не имеет смысла, потому что напоминание никогда не будет 0, и, конечно, компилятор не позволит это сделать.