#c
#c
Вопрос:
#include <stdio.h>
int main()
{
int a[100],m,n,i,j,flag,b[100];
scanf("%dn",amp;n);
for(i=0;i<n;i )
{
scanf("%d",amp;a[i]);
}
for(i=0;i<n;i )
{
m=a[i];
flag=0;
for(j=0;j<=m;j )
{
if(m%j==0){
flag=flag 1;
}
}
if(flag==2){
b[i]=m;
printf("%d",b[i]);
}
}
}
Я пытаюсь ввести n входных данных массива и распечатать только простые числа. Но результат, который я получил для приведенного выше кода:
OUTPUT:
5
7 4 2 6 5
Floating-point exception(core dumped)
Я хотел, чтобы на выходе было 7 2 5 4 6 простое число, за которым следует не простое число.
Комментарии:
1.
m%j
это неопределенное поведение, когдаj
равно 0. В этом случае вы получите FPE (разделите на 0).2.
if(m%j==0){
В этом проблема. Вы начинаете с j =03. О, понял. Но можете ли вы сказать, как напечатать все простые числа, за которыми следуют не простые числа?@ SerialLazer@kaylum
4. Если вы собираетесь использовать
scanf
(вы не должны), вы должны проверить его возвращаемое значение. Всегда.5. хорошо @WilliamPursell
Ответ №1:
простое число начинается с 2, но если ваш ввод имеет 0 и 1, примите их также во внимание при проверке. Есть лучшие способы найти простое число, для простоты я использовал то же, что и OP.
#include <stdio.h>
#define MAX_SIZE 100
int main()
{
//int a[MAX_SIZE],m,n,i,j,flag,b[MAX_SIZE];
// use better names for readability
int Numbers[MAX_SIZE]; // stores all the numbers
int m,n,i,j,flag;
printf("nEnter the number for PRIME range:");
if(1 != scanf("%d",amp;n))
printf(" read failed n");
printf("enter %d numbersn", n);
for(i = 0; i < n; i )
{
if(1 != scanf("%d",amp;Numbers[i]))
printf("read error in loopn");
}
printf("PRIMESn");
for(i = 0; i < n; i )
{
m = Numbers[i];
flag = 0;
if(m == 0 || m == 1)
continue;
// there are better ways to find prime , but using same as OP for simplicity
for(j = 1;j <= m; j )
{
if( m % j == 0)
{
flag = flag 1;
}
}
// 1 and itself , so prime
if(flag == 2)
{
printf("%d ", m);
}
}
return 0;
}
Комментарии:
1. Вы должны проверить значение , возвращаемое
scanf
. При вводе «foobar» первый scanf не изменит n, а цикл for повторяется от 0 до неопределенного числа и может переполнить массив. Всегда проверяйте значение, возвращаемое scanf.