0

次のコードで「浮動小数点例外、コアダンプ」という問題が発生していますが、float 変数または double 変数が 1 つもありません。printf をチェックすることで、isPrimeFunction で実行ジャムが発生することがわかりました。

/*
PROBLEM 3
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
*/


#include <stdio.h>

typedef int bool;
const bool true=1;
const bool false=0;

bool isPrime(long long int number) {
    long long int i;
    for(i=2; i < (number/2); i++) {
        if(number%i == 0) {
            return false;
        }
    }
    return true;
}   

int main() {
    long long int number, largest;
    number=600851475143;
    largest=0;
    int i;

    for(i=1; i <= (number/2); i++) {
        if((number % i) == 0) {
            if(isPrime(i) == true) {
                largest=i;
            }
        }
    }
    if(largest != 0)    
        printf("Largest prime factor is: %lli\n", largest);
    else
        printf("There is no prime factor of the number.\n");    

    return 0;
}
4

1 に答える 1

6

intはint であるためmaini収まるほど大きくない可能性が最も高いため、number/2(これは未定義の動作ですiが)ラップして最終的に 0number % iになる可能性が非常に高いことを意味します。その後、別の未定義の動作であるゼロによる除算が発生しますが、おそらく、システムが浮動小数点例外を生成する理由です(私の場合)。

注: これはあまり良いアルゴリズムではありません。ループする回数を数えるだけです。6,000 億のような数値が素数であってもisPrime、ループ内でテストをトリガーしない場合、実行時間は 1 時間近くになります。ループ内でテストを実行するたびに、ランタイムが大幅に増加します。

于 2018-03-15T14:46:49.747 に答える