Я занимаюсь упражнениями программирования на языке C Кочаном; только на начальном этапе, глава 5.Каков наилучший способ генерации простых чисел?
Вот задача:
Программа 5,10 имеет несколько неэффективности. Одна неэффективность получается из проверки четных чисел. Поскольку очевидно, что любое четное число больше 2 не может быть простым, программа может просто пропустить все четные числа как возможные простые числа и как возможные делители. Внутренний цикл также неэффективен, потому что значение p всегда делится на все значения d от 2 до. Эту неэффективность можно было бы избежать, добавив тест для значения is_prime в условиях цикла for. Таким образом, цикл for может быть настроен для продолжения до тех пор, пока не будет найден ни один делитель, а значение d меньше, чем p. Измените Программу 5.10, чтобы включить эти два изменения.
Вот программа 5,10
// generate a table of prime numbers
#include <stdio.h>
int main (void)
{
int p, d;
_Bool is_prime;
for (p = 2; p <= 50; ++p)
{
is_prime = 1;
for (d = 2; d < p; ++d)
if (p % d == 0)
is_prime = 0;
if (is_prime) // or if (is_prime != 0); same
printf ("%i ", p);
}
printf ("\n");
return 0;
}
Вот два варианта я пытаюсь писать, но и распечатывают пустое пространство; номера не производятся. Первый может представлять собой совершенно неправильный подход, , но я не понимаю, почему второй не сработает.
Вариант 1:
// generate a table of prime numbers
#include <stdio.h>
#include <stdbool.h>
int main (void)
{
int p, d;
bool is_prime;
/* start from p=2, do until p is less than 50,
and skip all even numbers */
for (p = 2; (p < 50) && (p % 2 != 0); ++p)
{
is_prime =1;
/* the inner for loop says: start from d = 2; do until
d is less than p, and also test if p is prime or not by
dividing p by d */
for (d = 2; d < p (p % d != 0 ? is_prime : !is_prime); ++d)
printf ("%i ", p);
}
printf ("\n");
return 0;
}
Вариант 2:
// generate a table of prime numbers
#include <stdio.h>
#include <stdbool.h>
int main (void)
{
int p, d;
bool is_prime;
/* start from p=2, do until p is less than 50,
and skip all even numbers */
for (p = 2; (p < 50) && (p % 2 != 0); ++p)
{
is_prime =1;
/* the inner for loop says: start from d = 2; do until
d is less than p, and also test if p is prime or not by
dividing p by d */
for (d = 2; (d < p) && (p % d != 0); ++d)
/* this inner loop was supposed to print the number if
it is not divided by d */
printf ("%i ", p);
}
printf ("\n");
return 0;
}
Я был бы признателен за вашу помощь! Я новичок в программировании.
Спасибо!
Что это такое: 'for (d = 2; d
@EugeneSh. Нет, он не компилируется. Показывает ошибку. – ameyCU
вы не понимаете, как 2 из 3 частей внутри '(...)' скобок для работы цикла. если он выполняется как ложное только один раз, весь цикл немедленно завершается. не используйте переменную 'is_prime', если вы никогда не устанавливаете ее. – hoijui