与えられた数の素因数を表示しようとしています。私のコードはいくつかの入力に対してはうまく動作しますが、他の入力に対しては終了してしまい、その理由を理解できません。ステータスが-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;
}
なく、あなたの問題の原因が、 'ULL MEM [10000000];' 76 ** MBを割り当てています**。それは静的に割り振るメモリが多すぎます。多くのメモリが必要な場合は、代わりに 'std :: vector'などのように動的に割り当てます。 –
@RemyLebeauどのような違いがありますか?実行時に同じ量のメモリを占有します。 – Barmar