2016-09-03 8 views
0

与えられた数の素因数を表示しようとしています。私のコードはいくつかの入力に対してはうまく動作しますが、他の入力に対しては終了してしまい、その理由を理解できません。ステータスが-107374167のプロセスが終了しました。

サンプル入力:

1 
561473 

出力:

2 

サンプル入力:

1 
10093 

、プログラムが終了します。

ある点では、浮動小数点例外かもしれないと思っていましたが、理由を理解できませんでした。私は、コードのすべての行をデバッグしようとした、プログラムのコード行で終わることがわかった:

while(ull(n%mem[j]) == 0) { 

私はまだこのコードは唯一のいくつかの特定の入力のために壊す理由を理解することができません。私はタイプキャスティングなしでも試しましたが、それでも私には同じ問題があります。例外を印刷しようとしましたが、プログラムが終了しただけでエラーは表示されませんでした。

#include <iostream> 
#include <string> 
#include <climits> 
#include <stdexcept> 
#include <algorithm> 
#include <set> 
#include <cmath> 

using namespace std; 

typedef unsigned long long ull; 
ull RANGE = sqrt(10000), num; 
unsigned int i; 
set<ull> arr; 
ull mem [10000000]; 

bool isPrime(unsigned long long n) { 
    if(n%2 == 0) 
     return false; 
    for(int i = 3; i <= sqrt(n); i+=2) { 
     if(n%i == 0) 
      return false; 
    } 
    return true; 
} 

void hungry() { 
    while(true) { 
     if(num > RANGE) 
      break; 
     if(isPrime(num)) { 
      mem[i++] = num; 
     } 
     num += 2; 
    } 
} 

int main() { 
    ios_base::sync_with_stdio (false); 
    cin.tie(NULL); 
    num = 3; i = 1; mem [0] = 2; 
    hungry(); 
    ull ip, n, temp; 
    cin >> ip; 
    while(ip) { 
     cin >> n; 
     arr.clear(); 
     temp = (ull) sqrt(n); 
     if(temp > RANGE) { 
      RANGE = temp; 
      hungry(); 
     } 
     if(n == 1) 
      cout << 0 << "\n"; 
     else { 
      while(n%2 == 0) { 
       arr.insert(2); 
       n = n/2; 
      } 
      for(int j = 1; mem[j] <= (ull)sqrt(n); j++){ 
       while(ull(n%mem[j]) == 0) { 
        arr.insert(mem[j]); 
        n = (ull)n/mem[j]; 
       } 
      } 

      if(n > 2) 
       arr.insert(n); 
      cout << arr.size() << "\n"; 
     } 
     ip--; 
    } 
    return 0; 
} 
+0

なく、あなたの問題の原因が、 'ULL MEM [10000000];' 76 ** MBを割り当てています**。それは静的に割り振るメモリが多すぎます。多くのメモリが必要な場合は、代わりに 'std :: vector'などのように動的に割り当てます。 –

+0

@RemyLebeauどのような違いがありますか?実行時に同じ量のメモリを占有します。 – Barmar

答えて

0

問題はhungryだけnの平方根までの素数でmemを埋めることです。 while (mem[j] <= (ull)sqrt(n))ループがこれらの最後に到達すると、mem[j]0であり、素数ではありません。そして、あなたがn % mem[j]をやろう、とループ0

変更により分裂を引き起こす:

while (mem[j] > 0 && mem[j] <= (ull)sqrt(n)) 
0

私はmem文の前にmem [j]の値を見るためにcoutを追加しました。問題のある入力に対しては、ある点の後に0を与えた。したがって、浮動小数点例外エラーが発生します。 %または/の第2オペランドは動作は未定義である ゼロであれば[...]

を;:あなたは、C++標準は言う0とモジュラスを取ることができません[...]

cout << "Mem: " << mem[j] << endl;                       
while(ull(n%mem[j]) == 0) {                         
    arr.insert(mem[j]);                          
    n = (ull)n/mem[j];                          
} 

出力:

1 10093 
Mem: 3 
Mem: 5 
Mem: 7 
Mem: 11 
Mem: 13 
Mem: 17 
Mem: 19 
Mem: 23 
Mem: 29 
Mem: 31 
Mem: 37 
Mem: 41 
Mem: 43 
Mem: 47 
Mem: 53 
Mem: 59 
Mem: 61 
Mem: 67 
Mem: 71 
Mem: 73 
Mem: 79 
Mem: 83 
Mem: 89 
Mem: 97 
Mem: 0 
Floating point exception (core dumped) 
関連する問題