fizzbuzz — Почему этот главный тестер C ++ и лето дают неверные результаты?

Я не понимаю, почему суммирование никогда не работает должным образом, но суммирует последовательно.
Это не выдает никаких ошибок, но никогда не дает правильного результата. По словам Вольфрама | Альфа, я могу получить до 20 000 000 000 для больших расчетов. Я понятия не имею, почему это происходит, поэтому любые идеи, которые вы могли бы иметь, с благодарностью!
Примечание. Скомпилировано с флагами -O3 и -std = c ++ 14.

Код:

#include "stdafx.h"#include <math.h>
#include <vector>
#include <stdio.h>
#include <iostream>
typedef unsigned long long ul;
const ul PRIMES = 1000000;
bool isPrime(ul n)
{
if (n <= 1) return false;
double sqN = sqrt(n);
for (ul i = 3; i <= sqN; i++) {
if ((int)n % i == 0) return false;
} return true;
}
int main()
{
std::vector<ul> primes;
ul sumPrimes = 0;
ul numPrimes = 0;
for (ul n = 2; n <= PRIMES; n++) if (isPrime(n)) primes.push_back(n);
numPrimes = primes.size();
for (ul sp : primes) sumPrimes += sp;
std::vector<ul> fizz, buzz, fizzbuzz;
ul sumF = 0, sumB = 0, sumFB = 0;
ul numF = 0, numB = 0, numFB = 0;
for (ul prime = 0; prime < primes.size(); prime++) {
if (prime % 15 == 0) {
fizzbuzz.push_back(primes[prime]);
}
else if (prime % 5 == 0) {
buzz.push_back(primes[prime]);
}
else if (prime % 3 == 0) {
fizz.push_back(primes[prime]);
}
}
for (ul fb : fizzbuzz) sumFB += fb;
for (ul f : fizz) sumF += f;
for (ul b : buzz) sumB += b;
numF = fizz.size(); numB = buzz.size(); numFB = fizzbuzz.size();
std::cout << "Stats for primes upto\t" << PRIMES << "\n";
std::cout << "Primecount:\t\t" << numPrimes << "\n";
std::cout << "Sum Primes:\t\t" << sumPrimes << "\n";
std::cout << "Fizzcount:\t\t" << numF << "\n";
std::cout << "Sum Fizz:\t\t" << sumF << "\n";
std::cout << "Buzzcount:\t\t" << numB << "\n";
std::cout << "Sum Buzz:\t\t" << sumB << "\n";
std::cout << "FizzBuzzcount:\t\t" << numFB << "\n";
std::cout << "Sum FizzBuzz:\t\t" << sumFB << "\n";
std::system("pause");
return 0;
}

И это вывод, который я получаю:
выход

-2

Решение

В вашем методе isPrime вы начинаете с i = 3. Начните с i = 2, так что вы удаляете не простые числа с множителем 2.

bool isPrime(ul n)
{
if (n <= 1) return false;
double sqN = sqrt(n);
for (ul i = 3; i <= sqN; i++) {
if ((int)n % i == 0) return false;
} return true;
}

Пытаться

bool isPrime(ul n)
{
if (n <= 1) return false;
double sqN = sqrt(n);
for (ul i = 2; i <= sqN; i++) {
if ((int)n % i == 0) return false;
} return true;
}

Если я что-то не так понял.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]