2017-04-10 2 views
-2

私は集計が正しく機能しない理由を知りませんが、一貫して合計します。 dosentはエラーを投げますが、決して正しい結果を得ません。 wolfram | alphaによれば、大きな計算には20,000,000 000もあります。なぜこのようなことが起こるのかわからないので、あなたが持っている可能性のあるアイデアは非常に高く評価されます! 注:-O3および-std = C++ 14フラグを指定してコンパイルしてください。なぜこのC++プライムチェッカーと夏は間違った結果を返しますか?

コード:

#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; 
} 

そして、これは私が手に出力されます:あなたが削除されるように、あなたのisPrime方法で output

+3

特定のテストケースで失敗するか、すべて失敗しますか?失敗した場合は、すべてのテストケースをシンプル/最小にし、デバッガを使用してコードを実行して、どこが崩れているかを確認します。 – NathanOliver

+3

'isPrime'では、入力引数(型が' unsigned long long')を 'int'に変換しません。そのキャストを取り除く。 –

+1

なぜあなたは%3から始めていますか? %2 == 0の数値はどちらも素数ではない –

答えて

1

、あなたはI = 2とI = 3スタートで始めています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; 
} 

私が何か誤解していない限り。

+0

2> sqrt(2)であるため、ガード節はすでに存在しています。 –

+0

読みやすさとスピードのために、私は素数をチェックするために[this version](http://stackoverflow.com/a/14418599/4342498)を使用します。 – NathanOliver

+0

@jan true。はるかに良い解決策である –

関連する問題