2016-03-31 2 views
0

Я начинаю и изучаю функции. Ниже приведен код, который я написал, чтобы узнать, является ли данное число простым. Но когда я его выполняю, я получаю диалоговое окно с надписью «project.exe перестает работать». Я использую dev C++. любая проблема с моим кодом?Функция поиска, если заданное число является простым

#include<stdio.h> 
int prime (int i); 
int main() 
{ 
    int a,b; 
    scanf("%d",&a); 
    b=prime(a); 
    if (b==1) 
    printf("prime"); 
    else 
    printf("not prime"); 
    return 0; 
} 
int prime (int i) 
{ 
    int j=0; 
    for (j=0;j<=i;j++) 
    { 
     if (i%j==0) 
     break; 
    } 
    if (j==i) 
    return 1; 
    else 
    return 0; 
} 
+2

На первом проходе через цикл 'j',' j' равен нулю. Вы не можете делить на ноль или взять оставшуюся часть такого разделения. Начните цикл с 'j = 2', потому что остаток деления на единицу всегда равен нулю. Аналогично для верхней границы: 'i% j' равно нулю, когда' i == j'. В конце концов, простое число делится на одно и само по себе. –

+0

Кроме того, если ваше условие завершения - 'j <= i',' j' не будет равно «i», если вы пройдете весь цикл, не выйдя из него. Лучше сразу вернуть 0 вместо того, чтобы выходить из цикла. –

+0

Вы должны изменить функцию на 'bool prime (int i)' и вернуть 'true' или' false'. Именование его 'is_prime' вместо этого также может быть хорошей идеей, чтобы указать, что он имеет логический результат. – Lundin

ответ

1

Изменить этот блок кода вашей прайм функции:

int j=0; 
    for (j=0;j<=i;j++) 
    { 
     if (i%j==0) 
     break; 
    } 

к:

int j; 
    for (j=2;j<=i;j++) 
    { 
     if (i%j==0) 
     break; 
    } 

Когда вы пытаетесь найти mod он на самом деле пытается найти его операции деления. Вы не можете разделить число на ноль, так как j изначально нулевое, программа прерывается.

+0

'j = 1' также неверно –

+0

Я не говорю об эффективности алгоритма первичного поиска. Я просто предложил решить проблему сбоя программирования. Кстати, я отредактировал ответ. – Imran

+0

Downvoice отменено. Это также гарантирует, что 1 и меньше номеров не обозначены как простые. 'j <= i' может' j

1

Следует начинать с 2, а не от 0. 0 вызывает деление на ноль, и именно поэтому ваша программа останавливается. Исправлено:

int j; 
for (j=2;j<i;j++) 
{ 
    if (i%j==0) 
    break; 
} 
if (j==i) 
    return 1; 
else 
    return 0; 
// or simply return j == i; 
+0

Мне не нужно ставить j <= i? если конечное условие j Vamshi

+1

@ Вамши: Да. Но вы не хотите проверять делимость числа с самим собой, потому что тест будет успешным, и вы ошибочно пометьте простое число как не-простое. –

0

Необходимо вернуть значение, которое не является единым. Что-то вроде этого ...

int prime (int i) { 
    int j; 

    if (i <=3) return 1; 
    for (j=2;j<i/2;j++) 
     if (i%j==0) return j; 

    return 1; 
} 

Проверяется количество i больше 3 также имеет важное значение.

+0

Он просто пытается написать функцию, которая дает логический результат: Is prime? правда или ложь. Он просто использует int вместо bool по неизвестным причинам. – Lundin

+0

Я думаю, что он использует C, у которого изначально не было bool. После того, как C++ вышел, я думаю, что все привыкли думать в bool. – ssm

Смежные вопросы