c ++: исключение с плавающей запятой (ядро сброшено)

Эй, что не так с этим кодом. Когда запускается этот код, он показывает некоторые ошибки с плавающей запятой (ядро не работает). Я использовал g ++ для компиляции этой программы.

#include <iostream>
using namespace std;

int checkprime(int num){
int ch=0;
for (int n=2;n<num;n++){
if (num%n==0){ ch=ch+1 ;}}
if (ch==0){return num;}
else{return -1; }
}int main(){
int prt=0;int a=2;long long int pri=600851475143;int arr_pr_fac[100];
int re;
while(a<pri){
a++;
if (pri%a==0){ re=checkprime(a) ;
if (re>0){arr_pr_fac[prt]=re;prt++;cout<<re<<endl;}

}
}
for(int th=0;th<4;th++){cout<<arr_pr_fac[th]<<endl;};
}

-3

Решение

Вот одна проблема:

    int a = 2; long long int pri = 600851475143;
// ...
while (a < pri) {
a++;
if (pri%a == 0) {  // <-- a will be 0 at some point

Так как вы увеличиваете a, это будет в конечном итоге обернуть до 0 из-за a только будучи подписанным int, а также pri быть целочисленным типом (long long). Как только это произойдет, взятие модуля 0 приведет к ошибке деления на ноль (что является неопределенным поведением).

Кроме того, ваш while цикл никогда не закончится, так как a < pri всегда будет true, (Правда, с таким большим значением для pri цикл будет работать долго, почти как если бы он не прерывался).

Исправление в том, что вы должны сделать a и, возможно, все ваши типы int (переменные, типы возврата из функций, типы массивов и т. д.) long long чтобы избежать этого и возможных других ошибок переполнения.

1

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

Как вы заявляете long long int pri = 600851475143.
Мы присваиваем значения вплоть до ПОИ. До а = 32767 все отлично работает. но после того, как он превращается в ноль, а = 32768. поэтому в заявлении
если (pri% a == 0) когда a = 0 дает исключение с плавающей запятой.
sol: объявить как долго долго Int.

0

Это, вероятно, переполняет массив. Может быть, использовать std :: vector.

Есть и другие серьезные проблемы с алгоритмом, если предположить, что он должен получить основные факторы.

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