четвер, 11 січня 2018 р.

Алгоритми на знаходження дільників

Задачі на знаходження дільників

натуральних чисел

Число i є дільником натурального числа n, якщо n mod i=0.
У кожного натурального числа обов’язково є два дільники: 1 та n.
Всі інші дільники натурального числа n (якщо вини є), знаходяться в інтервалі [2, n div 2].
Натуральне число називається простим, якщо у нього немає дільників в інтервалі [2, n div 2].
Щоб знайти всі дільники числа n, потрібно перевірити всі числа з інтервалу [1, n] на умову n mod i=0. Тобто це буде такий цикл:
for i:=1 to n do if n mod i=0 then...
Щоб перевірити, чи є число n простим, достатньо перевірити на цю умову всі числа з інтервалу [2, n div 2]. Тобто це буде такий цикл:
for i:=2 to n div 2 do if n mod i=0 then...

Приклад 1

Дано натуральне число n. Знайти всі його дільники, їх кількість та суму.
Дано: натуральне число n.
Знайти: Надрукувати його дільники, підрахувати їх кількість та знайти їх суму.

Результати роботи програми

ВвідВідповідьПояснення
121 2 3 4 6 12 6 28Вводимо число 12.
Його дільники: 1 2 3 4 6 12.
Кількість дільників –6.
Сума дільників – 28.

Змінні:

Вхідні:
  • n – натуральне число (цілого типу word, бо число натуральне)
Вихідні:
  • i – дільники та параметр циклу (цілого типу word)
  • k – кількість дільників (цілого типу word)
  • – сума дільників (цілого типу word).

Алгоритм

  1. Спочатку вводимо натуральне число n.
  2. Ми будемо знаходити кількість та суму. Тому присвоїмо початкове значення 0 змінним k та s.
  3. Нам потрібно знайти всі дільники числа n. Вони знаходяться в інтервалі [1, n].
  4. У циклі for i:=1 to n do будемо знаходити ці дільники. Для кожного будемо перевіряти умову n mod i=0 і, якщо вона вірна (тобто i є дільником n), то
    • виводимо на екран цей дільник оператором write(i,' ');
    • підраховуємо цей дільник оператором k:=k+1;
    • накопичуємо цей дільник у суму оператором s:=s+i.
  5. Коли цикл закінчиться, виводимо знайдені значення кількості та суми на екран оператором writeln(k,' ',s).

Програма

 var n,k,s,i:word;
begin
 read(n);
 k:=0;s:=0;
 for i:=1 to n do
    if n mod i=0 then
      begin
         write(i,' '); k:=k+1; s:=s+i;
      end;
 writeln(k,' ',s);
end.

Приклад 2

Для кожного натурального числа з інтервалу [A, B] знайдіть всі дільники, їх кількість та суму.
Дано: два натуральних числа A та B.
Знайти: Для кожного з чисел A, A+1, A+2,..., B знайти всі дільники, підрахувати їх кількість та знайти їх суму.

Результати роботи програми

ВвідВідповідьПояснення
a=10
b=14
дільники числа 10: 1 2 5 10 k=4 s=18
дільники числа 11: 1 11 k=2 s=12
дільники числа 12: 1 2 3 4 6 12 k=6 s=28
дільники числа 13: 1 13 k=2 s=14
дільники числа 14: 1 2 7 14 k=4 s=24
Вводимо числа 10 та 14.
Для кожного з чисел 10, 11, 12, 13, 14, знаходимо дільники, їх кількість та суму.
Перед дільниками виводимо на екран і само число

Змінні:

Вхідні:
  • A – ліва границя інтервалу (цілого типу word, бо числа натуральні)
  • B – права границя інтервалу (цілого типу word, бо числа натуральні)
Вихідні:
  • n – натуральне число з інтервалу [A, B] та параметр зовнішнього циклу (цілого типу word, бо число натуральне)
  • i – дільники числа n та параметр внутрішнього циклу (цілого типу word)
  • k – кількість дільників числа n (цілого типу word)
  • s – сума дільників числа n (цілого типу word).

Алгоритм

  1. Спочатку вводимо натуральні числа A та B, що є границями інтервалу.
  2. Для кожного числа n із цього інтервалу ми повинні повністю виконати попередній алгоритм, починаючи з пункту 2. Тому у нас будуть вкладені цикли:
    • зовнішній цикл: for n:=a to b do
      • перебирає числа n з інтервалу [A, B];
      • виводить ці числа на екран write(n);
      • для кожного числа n встановлює початкове значення для кількості та суми дільників s:=0; k:=0. Це обов’язково потрібно зробити у зовнішньому циклі, але перед внутрішнім.
    • внутрішній цикл for i:=1 to n do if n mod i=0 then для кожного числа n знаходить дільники та:
      • виводить на екран цей дільник оператором write(i,' ');
      • підраховує цей дільник оператором k:=k+1;
      • накопичує цей дільник у суму оператором s:=s+i.
    • Коли внутрішній цикл закінчиться, виводимо знайдені значення кількості та суми для даного числа на екран оператором writeln(k,' ',s) та переходимо на наступний виток зовнішнього циклу для обробки наступного числа.

Блок–схема програми

Програма

 var a,b,n,i,k,s:word;
begin
 write(a=');read(a);
 write('b=');read(b);
 for n:=a to b do
 begin
   write(дільники числа ',n,': ');
   s:=0;k:=0;
   for i:=1 to n do
      if n mod i=0 then
        begin
          write(i,' ');
          k:=k+1; s:=s+i;
        end;
   writeln(' k=',k,' s=',s);
 end;
end.

Приклад 3

Для кожного з чисел з інтервалу від 300 до 400 знайти суму дільників. Вивести на екран числа, у яких сума дільників кратна 10, а також саму суму дільників.
Знайти: Для кожного з чисел 300, 301, 302, ..., 400 додати всі дільники, і, якщо сума буде кратна 10, то вивести на екран число та знайдену суму.

Результати роботи програми

ВідповідьПояснення
n=304 s=620 n=312 s=840 n=316 s=560 n=319 s=360
n=323 s=360 n=327 s=440 n=328 s=630 n=342 s=780
n=343 s=400 n=344 s=660 n=348 s=840 n=349 s=350
n=351 s=560 n=354 s=720 n=356 s=630 n=358 s=540
n=359 s=360 n=360 s=1170 n=376 s=720 n=377 s=420
n=378 s=960 n=379 s=380 n=380 s=840 n=384 s=1020
n=389 s=390 n=395 s=480 n=398 s=600 n=399 s=640
В програму нічого не вводиться. Числа у відповіді мають коментарі: спочатку виводиться число n, а потім сума його дільників s.

Змінні:

Вхідних даних немає

Вихідні:
  • n – натуральне число з інтервалу [300,400] та параметр зовнішнього циклу (цілого типу word, бо число натуральне)
  • – дільники числа n та параметр внутрішнього циклу (цілого типу word)
  • s – сума дільників числа n (цілого типу word).

Алгоритм

  1. Так же як і у попередньому прикладі, у нас будуть вкладені цикли:
    • зовнішній цикл: for n:=300 to 400 do
      • перебирає числа n з інтервалу [300,400];
      • для кожного числа n встановлює початкове значення для суми дільників s:=0;
      • внутрішній цикл for i:=1 to n do if n mod i=0 then для кожного числа n знаходить суму дільників s:=s+i.
    • Коли внутрішній цикл закінчиться, перевіряємо знайдену суму s і, якщо вона кратна 10 (s mod 10=0), то виводимо на екран число n та знайдену суму оператором write('n=',n,'s=',s) та переходимо на наступний виток зовнішнього циклу для обробки наступного числа.

Програма

 var n,i,s:word;
begin
 for n:=300 to 400 do
 begin
   s:=0;
   for i:=1 to n do
     if n mod i=0 then s:=s+i;
   if s mod 10=0 then
   write(' n=',n,' s=',s);
 end;
end.

Приклад 4

Дано натуральне число n. Визначити, чи є воно простим?
Дано: натуральне число n.
Знайти: З’ясувати, чи є у числа дільники у інтервалі [2, n div 2].

Результати роботи програми

ВвідВідповідьПояснення
12NoУ числа 12 в інтервалі [2,6] є дільники: 2, 3, 4, 6. Тому число не є простим.
17YesУ числа 17 в інтервалі [2,8] немає дільників. Тому число є простим.

Змінні:

Вхідні:
  • n – натуральне число (цілого типу word, бо число натуральне)
Вихідні:
  • p – ознака наявності дільників (логічного типу, p=false немає дільників, p=true є дільники )
Проміжні:
  • i – дільники та параметр циклу (цілого типу word)

Алгоритм

  1. Спочатку вводимо натуральне число n.
  2. Ми будемо використовувати алгоритм з ознакою. Тому присвоїмо початкове значення ознаці p:=false. Тобто вважаємо, що дільників немає.
  3. Тепер у циклі for i:=2 to n div 2 do будемо шукати дільники. Для кожного i будемо перевіряти умову n mod i=0 і, якщо вона вірна (тобто i є дільником n), то установимо значення ознаки p:=true.
  4. Коли цикл закінчиться, то перевіримо значення ознаки:
    • Якщо p=false, то дільників немає, число просте, відповідь 'yes'.
    • Якщо p=true, то є дільники, число не просте, відповідь 'no'.

Програма

 var n,i: word; P:boolean;
begin
 read(n);p:=false;
 for i:=2 to n div 2 do
   if n mod i=0 then p:=true;
 if not p then writeln('yes')
          else writeln('no');
end.

Приклад 5

Знайдіть в інтервалі [A, B] всі прості числа.
Дано: два натуральних числа A та B.
Знайти: Для кожного з чисел A, A+1, A+2,..., B з’ясувати, чи є воно простим. Якщо число просте, то вивести його на екран.

Результати роботи програми

ВвідВідповідьПояснення
10 1411 13Вводимо числа 10 та 14.
Для кожного з чисел 10, 11, 12, 13, 14, шукаємо дільники в інтервалі [2,n div 2].
У числа 10 в інтервалі [2,5] є дільники 2 та 5, тобто число не просте.
У числа 11 в інтервалі [2,5] немає дільників, тобто число просте і тому виводиться на екран.
У числа 12 в інтервалі [2,6] є дільники 2, 3, 4 та 6, тобто число не просте.
У числа 13 в інтервалі [2,6] немає дільників, тобто число просте і тому виводиться на екран.
У числа 14 в інтервалі [2,7] є дільники 2 та 7, тобто число не просте. 

Змінні:

Вхідні:
  • A – ліва границя інтервалу (цілого типу word, бо числа натуральні)
  • B – права границя інтервалу (цілого типу word, бо числа натуральні)
Вихідні:
  • p – ознака наявності дільників (логічного типу, p=false немає дільників, p=true є дільники )
Проміжні:
  • n – натуральне число з інтервалу [A, B] та параметр зовнішнього циклу (цілого типу word, бо число натуральне)
  • – дільники числа n та параметр внутрішнього циклу (цілого типу word)

Алгоритм

  1. Спочатку вводимо натуральні числа A та B, що є границями інтервалу.
  2. Для кожного числа із цього інтервалу ми повинні повністю виконати попередній алгоритм, починаючи з пункту 2. Тому у нас будуть вкладені цикли:
    • зовнішній цикл: for n:=a to b do
      • перебирає числа n з інтервалу [A, B]
      • присвоює початкове значення ознаці p:=false. Тобто вважаємо, що дільників у числа n немає. Це обов’язково потрібно зробити у зовнішньому циклі, але перед внутрішнім.
    • У внутрішньому циклі for i:=2 to n div 2 do будемо шукати дільники числа n. Для кожного i будемо перевіряти умову n mod i=0 і, якщо вона вірна (тобто i є дільником n), то установимо значення ознаки p:=true.
    • Коли внутрішній цикл закінчиться, то перевіримо значення ознаки:
      • якщо p=false, то дільників немає, число n просте і тому виводиться на екран оператором write(n,' '), а потім виконується перехід на наступний виток зовнішнього циклу для обробки наступного числа.
      • якщо p=true, то є дільники, число не просте, число не виводиться, виконується перехід на наступний виток зовнішнього циклу для обробки наступного числа.

Програма

 var n,i,a,b: word; P:boolean;
begin
 read(a,b);
 for n:=a to b do
 begin
   p:=false;
   for i:=2 to n div 2 do
     if n mod i=0 then p:=true;
   if not p then write(n,' ');
 end;
end.

Варіанти задач

  1. Дано натуральне число n. Вивести на екран всі його парні дільники.
  2. Дано натуральне число n. Знайти суму його непарних дільників.
  3. Дано натуральне число n. Знайти кількість його парних дільників.
  4. Для кожного цілого числа з інтервалу [10,15] знайдіть всі непарні дільники.
  5. Дано натуральне число n. Надрукуйте його дільники та знайдіть середнє арифметичне його парних дільників.
  6. Знайдіть всі прості трьохзначні числа.
  7. Надрукуйте всі трьохзначні паліндроми, що є простими числами.
  8. В інтервалі [A, B] знайдіть кількість простих чисел.
  9. Для кожного цілого числа з інтервалу [30, 36] знайдіть кількість його парних дільників.
  10. Для кожного цілого числа з інтервалу [15, 20] знайдіть суму його непарних дільників.
  11. Знайдіть суму непарних дільників для кожного з цілих чисел від 50 до 70.
  12. Для кожного цілого числа з інтервалу [16, 24] знайдіть середнє арифметичне його парних дільників.
  13. Для кожного цілого числа з інтервалу [120; 140] знайдіть всі непарні дільники та їх кількість.
  14. Для кожного цілого числа з інтервалу [A, B] знайдіть кількість його парних дільників.
  15. Для кожного цілого числа з інтервалу [A, B] знайдіть всі його дільники, що кратні 3.
  16. З інтервалу [15, 25] виведіть на екран числа, у яких 4 дільники.

Немає коментарів:

Дописати коментар