#c #primes
#c #простые числа
Вопрос:
Я пытаюсь написать программу, в которой перечислены все простые числа в заданном параметре. Мой терминал ничего не выводит, хотя у меня есть функция печати в конце программы.
Не могли бы вы также сообщить мне, были ли необходимы переменные x и g или я мог просто придерживаться i.
Вот мой код:
#include <stdio.h>
#define MAX_SIZE 1000
int main(){
int N , i, x, g, a[MAX_SIZE];
scanf("%d", amp;N);
a[0] = 2;
for (i = 1; i < N - 2; i )
{
a[i] = (a[i-1]) 1;
}
for (x = 0; x < N - 2; x ){
for (i = 1; i < N - 2; i ){
if (a[i] % a[x] == 0) {
for (g = i; g < N - 2; g ){
a[g] = a[g 1];
}
}
}
}
for (i = 0; i < N - 2; i ){
printf("%d n", a[i]);
}
return 0;
}
Комментарии:
1. Если вы получаете исключение с плавающей запятой в коде, в котором нет математики с плавающей запятой, это может означать только одно: разделить на 0.
2. Плохо понимая алгоритм, причиной ошибки является деление на ноль
a[i] % a[x]
.3. Вы должны использовать отступы, чтобы ваш код было легче читать.
Ответ №1:
Здесь у вас ошибка «один за другим»:
for (g = i; g < N - 2; g ){
a[g] = a[g 1];
}
Когда g = N - 2 - 1
a[N - 2]
используется значение, но элемент не инициализирован, и значение не определено.
Вы должны проверить и исправить свой алгоритм, чтобы не читать неинициализированный элемент.
Ваш код выглядит слишком сложным для меня. Вот пример моего кода для печати всех простых чисел, которые равны N
или меньше:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int N;
int* primes;
int prime_count;
int i, j;
if (scanf("%d", amp;N) != 1) return 1;
primes = malloc(sizeof(*primes) * N);
if (primes == NULL) return 2;
prime_count = 0;
for (i = 2; i <= N; i ) {
int is_prime = 1;
for (j = 0; j < prime_count; j ) {
if (i % primes[j] == 0) {
is_prime = 0;
break;
}
}
if (is_prime) primes[prime_count ] = i;
}
for (i = 0; i < prime_count; i ) {
printf("%dn", primes[i]);
}
free(primes);
return 0;
}
Комментарии:
1. Но не позволяет g = i присваивать g значение? Я думаю, вы все равно имеете в виду g, я только новичок XD
2. @ChrisThomas Это дает
g
значение, но не даетa[N-2]
значения.3. На каком этапе мне назначить позицию массива N — 2? Кроме того, причина, по которой мне нужно использовать эту версию кода, заключается в том, что мой лектор указал, как должен работать наш алгоритм
4. @ChrisThomas Я предполагаю, что элемент не должен быть назначен, а условие
g < N - 2
должно быть заменено наg 1 < N - 2
.5. @ChrisThomas
g
Цикл удаляет элемент из массива. После удаления элемента массив становится короче на 1 иN
должен быть соответствующим образом скорректирован.