21 Востаннє редагувалося koala (12.11.2019 00:19:55)

Re: Як перевірити число на простоту?

Дуже грубо і без купи оптимізацій, зате вам буде зрозуміло, сподіваюся.

int main()
{
    int n,a, is_prime;//остання змінна - ознака простоти
    setlocale(LC_CTYPE, "ukr");
    printf("Vvediti n=");
    scanf_s("%i", &n);
    int num = 0;
    for (int i = 1;i <=n;i++)
    {
        printf("Введіть a%d = ",i);
        scanf_s("%d", &a);
        is_prime = 1; //оскільки булеві змінні ви ще не вчили, зробимо так: 1 - так, 0 - ні. Припустимо, що число просте
        for (int j = 2;j < a;++j)//якщо до j<=a, то останнє значення буде j==a, і a%j буде 0
            if (a%j == 0) //не забуваємо відступ
                is_prime = 0; //якщо поділилося, то не просте
        if(is_prime==1) //якщо is_prime не змінилося, значить, не поділилося ні на що
            num++;
    }
    printf("%i", num);
    return 0;
}
Подякували: 221VOLT, grinyuk309, vаrіg2kо3

22 Востаннє редагувалося 221VOLT (12.11.2019 02:33:22)

Re: Як перевірити число на простоту?

також, по темі оптимізацій --
існують різноманітні варіанти --

0 -- можна "в лоб" ділити на все підряд, від 2 і до (n - 1)
1 -- можна скористатись оптимізаціями, які запропонував mr. koala

2 -- у випадку організації частини програми у вигляді функції, у якості підпрограми,
яка не відповідає за спосіб отримання даних

Прихований текст

зчитування введених з клавіатури, отримання з інтернету, зчитування з диску etc

а лише перевіряє одне отримане число, та повертає bool (true/false) -- говорить, що це за число --

Прихований текст

так рекомендують писати великі програми -- не весь код в одній функції та одному файлі,
а розбивку на функції-підпрограми, розміщені по різних файлах (модульність),
кожна з яких, в ідеалі, вирішує одну невеличку задачу,
це дозволяє не писати багатократно одне і те ж,
а повторно застосовувати один раз написаний код,

Прихований текст

DRY - Don't repeat yourself -- тобто, пишіть без дублювання свого коду

як в межах одного проекту, так і легко переносити в інші проекти один раз написаний код

коли ми знайдемо дільник, ми зможемо написати дуже очевидне
повернення результату з функції у вигляді (return 0), щоб уникнути подальших перевірок
звичайно, код mr. koala вище, також так працює, та це не повністю очевидно,
особливо для новачка

можливо, вам показали робочий приклад з надією,
що з нюансами ви розберетесь самостійно

я не впевнений, що новачок зможе пояснити вчителю, у чім різниця між ++j та j++ , якщо вчитель про це запитає

я би не радив писати код у стилі "без дужок для if та for, якщо у нас далі йде лише одна інструкція"
це явно не покращує читабельність, є можливістю наламати дров помилок,
та може зробити пошук багів набагато довшим
imho краще писати завжди з дужками

Прихований текст
if(a % j == 0)
  is_prime = 0;

// -->

if(a% j == 0){
  is_prime = 0;
}

// або ж

if(a% j == 0)
{
  is_prime = 0;
}

// так же і з else-гілкою

if(..){..}else{..}

3 -- можлива додаткова оптимізація,
яка полягає у визначенні ряду простих чисел (чи деякої частини цього ряду) раніше, наперед,
ака "підготовка перед рантаймом",
і далі просто перевіряємо, чи є наше число у списку/масиві чисел
(або ж економимо час на розрахунку частини ряду), який ми уже розрахували заздалегідь,
щоб не визначати ці числа під час роботи програми

знаю, у випадку конкретно цієї задачі, напевно, смисл такої оптимізації не є надто великим,
хіба що вам дано досить багато чисел для перевірки )

це можливе за умови, що нам наперед відомий діапазон,
деякі числа з якого нам потрібно перевірити

у програмуванні часто виникає така потреба, та користуються таким рішенням --
деякі частини рішення різноманітних задач готують раніше,
можна це назвати "шаблоном" чи "пазлом", одним словом -- частиною рішення

такий прийом має смисл у випадках, якщо у нас є певні операції,
які потрібно застосувати багато разів, до багатьох елементів, об'єктів тощо,
та коли ми можемо ці операції виконати (частково, чи повністю) лише один раз,
замість того, щоб виконувати дуже багато разів


4 -- буває, що наперед заготовані дані та/або шаблони/пазли не вигідно тримати в оперативній пам'яті,
чи вони навіть повністю не поміщаються в оперативці --
у такому випадку ці дані зберігають на диску -- в файлі, чи базі даних,
зчитують невеличкими порціями, працюють з ними,
та переходять до зчитування наступних невеличких порцій


:) розумію, що вам, з великою ймовірністю, це все не є потрібним,
та раптом цікавим буде :)

успіхів з вирішенням задач-завдань!

23

Re: Як перевірити число на простоту?

adziri написав:
grinyuk309 написав:
koala написав:

Саме для цього і треба ділити на різні числа в циклі. Якщо не поділилося на жодне - значить просте.

int main()
{
    int n,a;
    setlocale(LC_CTYPE, "ukr");
    printf("Vvediti n=");
    scanf_s("%i", &n);
    int num = 0;
    for (int i = 1;i <=n;i++)
    {
        printf("Введіть a%d = ",i);
        scanf_s("%d", &a);
        for (int j = 2;j <= a;++j)
        if (a%j != 0)
            num++;
        
    }
    printf("%i", num);
    return 0;
}

Сьогодні спитав свою вчительку ОП як зробити це завдання і не отримав ніякої відповіді, бо вона сама не знає як його зробити, і потім, коли зустріла мене на коридорі після пари, запропонувала використати вкладений цикл.  Я написав, але виводить рандомні числа

Гм, ви майже на фінішній прямій.
Що означає виводить рандомні числа?
Ваш коди трохи брудний, давайте його спростимо і винесемо перевірку на простоту у ф-ю.
Рішення в лоб:

bool is_prime(int const number) noexcept { 
    if (number <= 1) return false; 

    for (int i = 2; i < number; i++)
        if (number % i == 0) return false;

    return true; 
} 

Очікуємо результат
is_prime(11) true
is_prime(15) false

Тепер можна взяти послідовність чисел, скористаюсь генератором випадкових чисел, з сайту random.org
Ось, що отримав:
64  73  60  65  41  63  34  95  32  77
Занесемо це в код.

int sequence[10]{64, 73, 60, 65, 41, 63, 34, 95, 32, 77};
int count_of_prime_numbers;
for (int i = 0; i < 10; i++)
    if (is_prime(sequence[i])) count_of_prime_numbers++;

Залишається вивести count_of_prime_numbers, ну вроді відповідь має бути 2.


Можна зразу в коді? І так я ще не вивчав масиви

24

Re: Як перевірити число на простоту?

Adziri, він не вивчав масиви, функції та булеві змінні. І так добре.

Подякували: 221VOLT, vаrіg2kо2

25 Востаннє редагувалося wander (12.11.2019 18:30:52)

Re: Як перевірити число на простоту?

Гм, а як ж так?
Ви не знаєте примітивів мови програмування, але вже вирішуєте завдання?
Типи змінних, цикли та масиви це одні з перших уроків по будь-яких мовах.
Тоді так, рішення пана Коали вам швидше підійде..

Подякували: 221VOLT1

26

Re: Як перевірити число на простоту?

У різних людей різна швидкість навчання. А завдання на найпримітивніші цикли, так що не бачу особливих проблем.

Подякували: vаrіg2kо1

27 Востаннє редагувалося wander (12.11.2019 19:00:52)

Re: Як перевірити число на простоту?

koala написав:

У різних людей різна швидкість навчання. А завдання на найпримітивніші цикли, так що не бачу особливих проблем.

А то цикли ТС вже знає.
Всеодно якось вибірково вчать чи що?
Мені цікаво які приклади на цикли показували, що без масивів обійшлось?
Зазвичай це як хелоу ворлд - перебрати масив циклом..

А задача насправді не така вже і елементарна, особливо, якщо ти в цьому тільки-тільки почав розбиратися. Ніколи не любив вирішувати одразу якісь математичні штуки.
Чому б не дати завдання типу заповнити масив і вивести його на екран, так це ще більш елементарно, зате запам’ятовується як це працює. Це знаєте як у психології тре починати з маленького, але, щоб міг сам написати і як воно приємно коли запрацює. А коли складне дають і ти не можеш вирішити цього, то і руки опускаються і це відбиває всяке бажання щось робити далі.

Насправді в нас така проблема є всюди, не лише коли вчителі чи викладачі вчать вас програмувати, така ж проблема і коли вчать математики, хімії, фізики і тд.

По собі знаю, в мене в школі будь-який потяг до математики відбили десь з 8-9 класу і аж до 2 курсу універу. І от досі, сам тепер вчуся, математики.

Подякували: 221VOLT1

28

Re: Як перевірити число на простоту?

Програмування починали викладати з математичних задач, бо математика - найвпорядкованіша дисципліна зі шкільних; але оскільки математику зараз вчать погано, а вчителі інформатики часто не розуміють, чому їм викладали саме з математики - то маємо таку халепу.

Подякували: wander, 221VOLT, vаrіg2kо3

29

Re: Як перевірити число на простоту?

adziri, а ви з якого віку програмувати почали?

Подякували: grinyuk309, 221VOLT, vаrіg2kо3

30 Востаннє редагувалося wander (05.12.2019 18:30:05)

Re: Як перевірити число на простоту?

koala написав:

adziri, а ви з якого віку програмувати почали?

Гм, вперше мені вдалось пощупати програмування десь у віці 16, на паскалі ще.
Але так, щоб осмисленно і реально почав вчити С++ це десь з 18 років.

Подякували: 221VOLT1

31

Re: Як перевірити число на простоту?

А я почав у 12, на Basic. І можу сказати, що шлях пана grinyuk309 - не найгірший з можливих.

Подякували: 221VOLT, vаrіg2kо2

32 Востаннє редагувалося wander (12.11.2019 19:23:59)

Re: Як перевірити число на простоту?

koala написав:

А я почав у 12, на Basic. І можу сказати, що шлях пана grinyuk309 - не найгірший з можливих.

Не споритиму, бо не знаю точно, який би був найгіршим, але і далекий від хорошого.
Єдине, що можу порадити ТСу (якщо його це цікавить) - це вчити самому, а не надіятися на наших викладачів. Зазвичай це набагато ефективніше і швидше. Інше питання це заставити себе вчитися.

Подякували: koala, 221VOLT2

33

Re: Як перевірити число на простоту?

koala написав:

Програмування починали викладати з математичних задач, бо математика - найвпорядкованіша дисципліна зі шкільних; але оскільки математику зараз вчать погано, а вчителі інформатики часто не розуміють, чому їм викладали саме з математики - то маємо таку халепу.

і ще є викладачі, яким самим це не цікаво,
тому вони самі лише звідкись завдання і приклади копіпастять,
без вникання в нюанси, без розуміння в деталях((

adziri написав:
koala написав:

adziri, а ви з якого віку програмувати почали?

Гм, вперше мені вдалось пощупати програмування десь у віці 16, на паскалі ще.
Потім був коледж, де нам на 2 курсі почали викладати С++ і от звідти почалося.
Хоча знаєте як воно в нас вчать, не дуже..

...

Тож так щоб осмисленно і реально почав вчити С++ це десь з 18 років.

у мене точнісінько так же,
тільки осмислено вчити я розпочав був php та js, і на фріланс пішов )

adziri написав:

Єдине, що можу порадити ТСу (якщо його це цікавить) - це вчити самому, а не надіятися на наших викладачів.

це так)
дуже хороша порада!

надіятись можна лише на себе, ніхто все готовеньке не принесе на блюдечку
(вийняток -- ви народились в сім'ї мільярдерів, але багаті також плачуть)

кожна людина сама себе відповідальність за своє життя, свідомо чи несвідомо :)

Подякували: wander1

34

Re: Як перевірити число на простоту?

koala написав:

Дуже грубо і без купи оптимізацій, зате вам буде зрозуміло, сподіваюся.

int main()
{
    int n,a, is_prime;//остання змінна - ознака простоти
    setlocale(LC_CTYPE, "ukr");
    printf("Vvediti n=");
    scanf_s("%i", &n);
    int num = 0;
    for (int i = 1;i <=n;i++)
    {
        printf("Введіть a%d = ",i);
        scanf_s("%d", &a);
        is_prime = 1; //оскільки булеві змінні ви ще не вчили, зробимо так: 1 - так, 0 - ні. Припустимо, що число просте
        for (int j = 2;j < a;++j)//якщо до j<=a, то останнє значення буде j==a, і a%j буде 0
            if (a%j == 0) //не забуваємо відступ
                is_prime = 0; //якщо поділилося, то не просте
        if(is_prime==1) //якщо is_prime не змінилося, значить, не поділилося ні на що
            num++;
    }
    printf("%i", num);
    return 0;
}

Дякую, я не відписував доки не знайшов час, щоб розібратись з кожним рядком завдання і я все зрозумів.

Подякували: 221VOLT, varkon2

35

Re: Як перевірити число на простоту?

Для чого тут це?

noexcept

В інтернеті мало інформації про цей специфікатор

koala написав:

Рішення в лоб:

bool is_prime(int const number) noexcept { 
    if (number <= 1) return false; 

    for (int i = 2; i < number; i++)
        if (number % i == 0) return false;

    return true; 
} 

36

Re: Як перевірити число на простоту?

noexcept позначає, що функція не викидатиме виключних ситуацій, що дозволяє компілятору агресивніше її оптимізувати.
Вже не пам'ятаю, чого я сюди його приліпив, на функціональність це не впливає, а код настільки неефективний, що користі все одно нуль. Мабуть, щось одночасно оптимізував на роботі.

Подякували: grinyuk309, leofun012

37

Re: Як перевірити число на простоту?

koala написав:

Вже не пам'ятаю, чого я сюди його приліпив

Це мій код :)

koala написав:

на функціональність це не впливає, а код настільки неефективний, що користі все одно нуль

Ну, користі може і нуль, а може і ні, якщо буде можливість оптимізувати цей код, то компілятор це зробить для нас.
Специфікатор noexcept дійсно доволі важкий для передбачення програмістом, бо важко на око сказати, який виграш ми отримаємо, але нам це і не важливо, як тільки буде можливість компілятор все зробить сам. Там насправді доволі великий пул оптимізацій може бути застосовано (Stack unwinding, Cleanup, etc).

Подякували: koala1