Эй, что не так с этим кодом. Когда запускается этот код, он показывает некоторые ошибки с плавающей запятой (ядро не работает). Я использовал 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;};
}
Вот одна проблема:
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
чтобы избежать этого и возможных других ошибок переполнения.
Как вы заявляете long long int pri = 600851475143.
Мы присваиваем значения вплоть до ПОИ. До а = 32767 все отлично работает. но после того, как он превращается в ноль, а = 32768. поэтому в заявлении
если (pri% a == 0) когда a = 0 дает исключение с плавающей запятой.
sol: объявить как долго долго Int.
Это, вероятно, переполняет массив. Может быть, использовать std :: vector.
Есть и другие серьезные проблемы с алгоритмом, если предположить, что он должен получить основные факторы.