Алгоритмические основы информатики. Учебное пособие
.pdffor (int i=1;i<=n;i++) if (prime(i))
{
cout<<i<< ' '; k++;
}
if (k==0) cout<<"No prime"<<k; return 0;
}
Контрольные вопросы
1.Какое число называется простым, а какое составным?
2.Назвать самое большое простое число.
3.Какую роль играют простые числа в криптографии и как они используются в алгоритме RSA?
4.Что такое факторизация числа и для чего она используется?
5.Какие существуют методы нахождения простых чисел и в чем их
суть?
6.Какие программы используются для нахождения больших простых чисел, и какие функции они выполняют?
Задачи
1.Создать программу, которая принимает число n и выводит все простые числа до n.
2.Создать программу, которая проверяет, является ли данное число простым.
3.Создать программу, которая генерирует таблицу простых чисел, показывая первые 100 простых чисел.
4.Создать программу, которая раскладывает заданное число на простые множители.
5.Создать программу для поиска чисел-близнецов, используя простые числа.
6.Создать программу, которая решает проблему совершенных чисел, используя простые числа.
7.Создать программу для генерации простых чисел с использованием решета Эратосфена.
8.Создать программу, которая использует простые числа для шифрования и дешифрования текста по алгоритму RSA.
21
9.Создать программу, которая выполняет факторизацию заданного числа с использованием простых чисел.
10.Создать программу, которая генерирует таблицу простых чисел, показывая первые 100 простых чисел.
11.Создать программу, которая раскладывает заданное число на простые множители.
12.Создать программу для поиска чисел-близнецов, используя простые числа.
13.Создать программу, которая решает проблему совершенных чисел, используя простые числа.
14.Создать программу для генерации простых чисел с использованием решета Эратосфена.
15.Создать программу, которая использует простые числа для шифрования и дешифрования текста по алгоритму RSA.
16.Создать программу, которая выполняет факторизацию заданного числа с использованием простых чисел.
17.Найти каноническое разложение данного натурального числа. Составьте программу для проверки, можно ли заданное натуральное число представить в виде:
а. произведения двух простых чисел;
b.произведения трех простых чисел;
c.квадрата какого-либо простого числа;
d.куба какого-либо простого числа.
18.Два нечетных простых числа, отличающиеся на 2, называются числами-близнецами. Например, числа 5 и 7. Написать программу, которая будет находить все числа-близнецы на отрезке [2; 1000].
19.Найти все такие простые числа, не превосходящие заданного N, двоичная запись которых представляет собой симметричную последовательность нулей и единиц (начинающуюся с единицы).
2.3.2. Палиндромы
Палиндром – слово, число или последовательность символов, которые читаются одинаково в обоих направлениях. Например, слова «мадам», «шалаш», «казак» являются палиндромами.
Разработка алгоритмов с использованием палиндромов может включать в себя следующие задачи.
22
Поиск палиндромов в строке. Это можно сделать, например, с помощью регулярного выражения, которое проверяет, совпадают ли первая и последняябуквыичто серединастрокитакжеявляетсяпалиндромом.
Генерация палиндромов заданной длины. Это можно сделать с по-
мощью рекуррентного соотношения, которое использует уже сгенерированные палиндромы меньшей длины. Например, если мы хотим сгенерировать палиндром длины n, мы можем взять любой палиндром длины n-1 и добавить к нему две одинаковые буквы в начале и в конце.
Пример1.Верноли,чтозаданноенатуральноечислоn–палиндром. Пояснения. Реализация алгоритма определения того, является ли число палиндромом, может быть осуществлена путем преобразования числа в строку и проверки того, является ли она палиндромом. Например, число «121» является палиндромом, поскольку его строка «121» также является палиндромом. Реализация такого подхода на языке C++
будет выглядеть следующим образом:
/*Верно ли, что заданное натуральное число n - палиндром*/
#include <iostream> #include <string> #include <cmath> using namespace std;
bool is_palindrome(int n) { string s = to_string(n);
for (int i = 0; i < s.length() / 2; i++) { if (s[i] != s[s.length() - 1 - i]) { return false;
}
}
return true;
}
int main () { int n;
cout<<"n= "; cin>>n; if (is_palindrome (n)) cout<<"yes";
else cout<<"no"; return 0;
}
23
Пример2.Верно ли,чтозаданноенатуральноечисло b– палиндром. Пояснения. Ниже представлена реализация алгоритма, использующая операции целочисленного деления. Суть алгоритма заключается в том, что формируется из исходного числа новое число, в котором цифры исходного записаны в обратном порядке. Число является палиндро-
мом, если исходное и новое числа совпадают.
// Верно ли, что заданное натуральное число b – палиндром.
#include <iostream> using namespace std; int main()
{
int a,b,invert;
cout<<"введите целее число, не более 10000: "; cin >>b;
a=b; invert=0; while (a!=0)
{
invert=invert*10+a%10;
a=a/10;
}
cout<<"исходное число "<<b;
if (b==invert) cout<<" является палиндромом"; else cout<<" не является палиндромом"; return 0;
}
Контрольные вопросы
1.Что такое палиндром?
2.Как можно использовать палиндромы в программировании?
3.Как найти все палиндромы в строке?
4.Можно ли генерировать палиндромы заданной длины?
5.Как определить, является ли число палиндромом?
Задачи
1.Программа принимает на вход число n. Вывести на печать первое следеющее за ним число-палиндром.
2.Написать программу, которая находит количество палиндромов среди чисел от 1 до заданного числа n.
24
3.Написать программу, которая генерирует последовательность палиндромов, начиная с 1, и заканчивает на заданном числе n.
4.Написать программу, которая определяет, можно ли представить заданное число в виде суммы двух палиндромов (например, 121 =
=101 + 20).
5.Написать программу, которая генерирует все различные палиндромы длины n.
6.Написать программу, которая переводит данное натуральное число n в p-ичную систему счисления (p = 2, 3, 4, 5, ..., 9) и проверяет, является ли оно палиндромом.
2.3.3. Дружественные и совершенные числа
Совершенные числа – это натуральные числа, равные сумме всех своих делителей (включая 1 и само число). Например, число 6 является совершенным, так как его делители (1, 2 и 3) в сумме дают 6. Число 28 также является совершенным, так как его делители (1, 2, 4, 7 и 14) в сумме также дают 28.
Совершенные числа были известны еще в древности и вызывали интерес у математиков разных эпох. Одной из наиболее известных задач, связанных с совершенными числами, является гипотеза о том, что все четные совершенные числа могут быть представлены в виде 2p-1(2p+1), где p также является простым числом.
Существуют различные методы нахождения совершенных чисел, включая использование формул, алгоритмов и компьютерных программ. Однако до сих пор не известно, существует ли бесконечно много совершенных чисел.
Дружественными числами называются такие два числа, что сумма делителей первого (кроме его самого) равна второму, а сумма делителей второго (опять же кроме его самого) равна первому.
Дружественные числа были открыты в Древней Греции и с тех пор стали объектом исследования математиков. Одной из самых известных задач, связанных с дружественными числами, является проблема Гольдбаха, которая утверждает, что любое четное число может быть представлено в виде суммы двух простых чисел.
Существует несколько методов нахождения дружественных чисел, включая метод проб и ошибок, использование формул и алгоритмов, а также использование компьютерных программ для генерации больших наборов дружественных чисел.
25
Пример 1. Верно ли, что даны два натуральных числа X и Y – дружественные числа.
// Верно ли, что даны два натуральных числа X и Y - дружественные числа.
#include <iostream> #include <math.h> using namespace std; int summa(int n){ int s=0;
for (int d=1;d<=n/2;d++) if (n%d==0) s+=d; return s;
}
int main(){ int x,y;
cout<<"enter two of numbers - ";cin>>x>>y; if (x==summa(y) && (y==summa(x))) cout<<x<<" and "<<y<<" - drug";
else cout<<" - no";
return 0;
}
Пример 2. Верно ли, что заданное число - совершенное. // Верно ли, что заданное число - совершенное. #include <iostream>
#include <math.h> using namespace std; int main(){
int n;
cout<<"enter number n - ";cin>>n;
// находим сумму делителей, 6-совершенное число, 6=1+2+3 int s=0;
for (int d=1;d<=n/2;d++) if (n%d==0) s+=d;
if (n==s) cout<<n<<" - soversh"; else cout<<n<<" - no soversh"; return 0;
}
26
Пример 3. Найти количество совершенных чисел, не превышающих заданное натуральное число.
#include <iostream> #include <math.h> using namespace std; int summa(int n)
{
int s=0;
for (int d=1;d<=n/2;d++) if (n%d==0)
s+=d; return s;
}
int main()
{
int n,k=0,s; cout<<"n="; cin>>n;
for (int i=1;i<=n;i++)
{s=summa(i); if (s==i)k++;
}
cout<<"k="<<k; return 0;
}
Контрольные вопросы
1.Дать определение совершенных и дружественных чисел.
2.Какими свойствами обладают совершенные и дружественные числа?
3.Какие существуют методы нахождения совершенных и дружественных чисел?
4.Какова история исследования совершенных и дружественных чисел?
5.Каковы современные гипотезы и проблемы, связанные с совершенными и дружественными числами?
Упражнения
1.Выполнить тестирование рассмотренных алгоритмов, используя полный набор системы тестов.
2.Выполнить обоснование алгоритмов.
27
Задачи
1.Найти все совершенные числа в заданном интервале.
2.Написать рекурсивный алгоритм для нахождения n-го совершенного числа.
3.Сгенерировать все совершенные числа, которые могут быть получены перемножением двух простых чисел, и найти их сумму.
4.Написать программу для проверки, является ли заданное число совершенным.
5.Найти количество совершенных чисел в заданном интервале.
6.Найти все дружественные пары чисел в заданном интервале.
7.Написать программу для проверки, является ли заданная пара натуральных чисел дружественными.
8.Найти количество дружественных чисел в заданном интервале.
9.Сгенерировать все дружественные числа, которые могут быть получены сложением двух простых чисел, и найти их сумму.
10.Написать рекурсивный алгоритм для нахождения n-й пары дружественных чисел.
11.Создать программу, которая вычисляет сумму всех дружественных чисел до заданного пользователем числа.
12.Создать программу, которая генерирует все возможные дружественные числа и выводит их в порядке возрастания.
2.3.4. Числа Фибоначчи
Числа Фибоначчи представляют собой последовательность натуральных чисел, которая начинается с двух единиц (1, 1), а каждый следующий элемент равен сумме двух предыдущих элементов. Эта последовательность была впервые описана итальянским математиком Леонардо Пизанским (известным как Фибоначчи) в 12 веке.
Числа Фибоначчи имеют множество интересных свойств и применений в различных областях математики и физики. Например, они используются для описания спиралей в природе, таких как раковины улиток и цветочные лепестки. Также они играют важную роль в теории хаоса и фрактальной геометрии.
Одним из наиболее интересных свойств чисел Фибоначчи является то, что они образуют геометрическую прогрессию, то есть каждое следующее число примерно в 1.62 раза больше предыдущего. Это свойство используется в различных приложениях, включая дизайн и архитектуру, где числа Фибоначчи используются для создания гармоничных пропорций и симметрии.
28
Еще одно интересное свойство чисел Фибоначчи связано с так называемым «золотым сечением», которое представляет собой отношение двух соседних чисел Фибоначчи, равное примерно 1.618. Это соотношение часто используется в искусстве и архитектуре для создания эстетически приятных форм и композиций.
Пример 1. Дано число n. Требуется найти n-е число Фибоначчи.
// Дано число n. Требуется найти n-е число Фибоначчи.
#include <iostream> using namespace std; int main(){
int n,pred1,pred2,number_n; cout<<"Enter n="; cin>>n; pred1=1;pred2=1;
for (int i=3;i<=n;i++)
{
number_n=pred1+pred2; pred1=pred2; pred2=number_n;
}
cout<<" n число Фибоначчи: "<<number_n; return 0;
}
Контрольные вопросы
1.Каково определение чисел Фибоначчи и как они связаны с последовательностью Фибоначчи?
2.Какие свойства чисел Фибоначчи делают их полезными в различных областях науки и техники?
3.Как числа Фибоначчи связаны с золотым сечением и почему это важно?
4.Какие алгоритмы используются для вычисления чисел Фибоначчи и какие сложности они имеют?
5.Какие примеры практического использования чисел Фибоначчи можно привести?
Упражнения
1. Составить алгоритм нахождения n-го числа Фибоначчи с использованием рекурсивной функции.
29
2.Составить алгоритм нахождения суммы первых n чисел Фибоначчи с использованием итеративной функции.
3.Составить алгоритм проверки, является ли данное число числом Фибоначчи, с использованием логического выражения.
4.Составить алгоритм, который выводит первые n чисел Фибоначчи в виде треугольника, используя цикл while и вложенные циклы for.
5.Составить алгоритм поиска наибольшего общего делителя двух чисел, используя алгоритм Евклида и числа Фибоначчи.
Задачи
1.Даны два числа a и b. Требуется найти их наибольший общий делитель, используя алгоритм Фибоначчи.
2.Требуется найти сумму первых n чисел Фибоначчи.
3.Дана последовательность чисел a1, a2, …, an. Требуется проверить, являетсялиэтапоследовательность последовательностьюФибоначчи.
4.Дан массив чисел a1, a2, …, aN. Требуется найти в этом массиве все числа Фибоначчи.
5.Построить треугольник Паскаля до n-й строки, используя числа Фибоначчи.
6.Найти количество делителей числа Фибоначчи F(n), используя
рекурсию.
7.Найти k-е простое число Фибоначчи (k ≥ 1).
8.Реализовать класс для работы с числами Фибоначчи на основе
динамического программирования.
9. Написать программу для нахождения всех чисел Фибоначчи меньше заданного числа N.
10. Пифагоровы числа. Три натуральных числа a, b и c образуют пифагорову тройку, если c2=a2+b2. Пифагорова тройка называется основной, если наибольший общий делитель ее чисел равен единице. Например, 3, 4, 5 – основная тройка, 6, 8, 10 – производная тройка. Найти все основные пифагоровы тройки, числа в которых не превышают данное число max.
11.Треугольник Паскаля. Вывести на экран треугольник Паскаля из n строк. Придумать структуру данных для хранения треугольника Паскаля (например, стандартная матрица, что, однако, не экономно). Реализовать показ треугольника по данным из этой структуры.
12. Число,состоящееизn (n>1) цифр,называетсячислом Армстронга, если сумма его цифр, возведенных в n-ю степень, равна самому этому числу. Например, числами Армстронга являются 153 и 1634, так как 153=13+53+33 и 1634=14+64+34+44.Составить программу, которая будет находитьвсеn-значныечислаАрмстронга(n<10).
30
