
- •Министерство образования и науки Республики Казахстан
- •Кафедра программного обеспечения
- •Языки программирования
- •Лабораторная работа № 1
- •Краткая теория
- •Задания
- •Лабораторная работа № 2
- •Краткая теория
- •Задания
- •Лабораторная работа №3
- •Краткая теория
- •Задания
- •Лабораторная работа № 4
- •Краткая теория
- •Задания
- •Лабораторная работа № 5
- •Краткая теория
- •Задания
- •Лабораторная работа № 6
- •Краткая теория
- •Объединения
- •Задания
- •Лабораторная работа № 7
- •Краткая теория
- •Задания
- •Лабораторная работа № 8
- •Краткая теория
- •Задания
Задания
Вычислить значение K:
K
=
Вычислить значение N:
N
=
Вычислить значение K:
K
=
Даны числа a и b. Вычислить значение K:
K
=
Дано целое число n. Вычислить значение K:
K
=
Даны числа a и b. Вычислить значение K:
K
=
где P
=
Даны натуральные числа a и b. Вычислить значение N:
N
=
где P
=
Дано число m. Вычислить значение K:
K
=
где P
= m2+m
Даны целые числа x, y, z. Вычислить значение K:
K
=
10 *. Дано натуральное число n. Вычислить значение K:
K
=
Лабораторная работа № 2
Дисциплина: Языки программирования
Тема: Задачи целочисленной арифметики
Цель: изучить приведенные примеры, уметь решать все задачи с линейными массивами
Краткая теория
Существует широкий круг задач, которые оперируют натуральными числами. Подавляющее большинство получаемых значений в таких задачах также являются натуральными числами. Представить такие значения можно с помощью переменных типа int. Для успешного решения подобных задач необходимо хорошо знать операции, выполняемые над данным типом, а также функции, работающие с такими значениями.
Чаще всего используются арифметические операции + , - , * , / , % , ++ , -- .
Помните, что знак деления / для целых операндов выполняет целочисленное деление, т.е. 5/2=2, 4/3=1, 8/4=2.
Операция % дает целочисленный остаток от деления: 5%2=1, 4%3=1, 8%3=2, 8%4=0.
Часто в задачах подобного вида необходимо осуществить возведение в степень. Стандартные функции, выполняющие эти операции, определены в файле math.h:
pow(x,y) - возведение x в степень y
pow10(x) - возведение 10 в степень x
Обе функции дают результат типа float. Чтобы его присвоить переменной типа int, необходимо выполнить явное преобразование к этому типу. Например:
int x,y;
...
x= x+(int)pow(x,y);
Наиболее типичными приемами в ходе решения задач являются:
определение порядка натурального числа;
выделение некоторой цифры числа;
формирование из цифр исходного числа нового числа.
Продемонстрируем их на примерах:
1.
Определить порядок и сумму цифр заданного натурального числа.
Порядок числа - это количество цифр в числе, а значит, значение целое. Сумма цифр, очевидно, тоже будет принадлежать к целому типу.
Для решения задачи придется перебрать все цифры числа. Удобнее начать перебор с последней цифры, так как она выделяется как остаток от деления числа на 10.
Рассмотрим число 1234.
1234%10= 4 - первая цифра есть.
Чтобы получить вторую цифру, очевидно цифру 4 надо как-то откинуть. Используем целочисленное деление числа на 10, понижая разрядность числа:
1234/10=123
Выделяем следующую цифру:
123%10=3 ; откидываем 3 - 123/10=12
Аналогично поступаем далее:
12%10=2 - 12/10=1
1%10=1 - 1/10=0
В результате мы свели число к 0, то есть все цифры числа перебрали.
Таким образом, предложенные действия выполняются до тех пор, пока число не будет сведено к нулю, попутно наращивая каждый раз значение порядка на 1, а сумму - на значение вновь найденной цифры.
Действия реализуются через конструкцию цикла while. Предварительно зададим исходные значения порядка и суммы, равными 0.
# include <stdio.h>
main()
{
int n; // исходное число
int p=0, s=0; // результат - порядок числа и сумма цифр
printf("\n введите n\n");
scanf("%d",&n);
while(n>0)
{
s+=n%10;
n/=10;
p++;
}
printf("\n порядок числа p =%d",p);
printf("\n сумма цифр s=%d",s);
}
2.
Дано натуральное число n. Получить новое число переставлением цифр исходного числа в обратном порядке.
Как и в предыдущей задаче, нам необходимо перебрать все цифры исходного числа.
Например,
задано число n=1234, представим его так:
1234 = 1*103 + 2*102 + 3*101 + 4*100
обратное к нему число - это сумма следующего вида:
4321 = 4*103 + 3*103 + 2*101 + 1*100
Можно, конечно, сначала определить порядок числа p, а затем получить новое число по указанной выше формуле суммы:
for(i=1;i<=p;i++)
{
s+=n%10*(int)pow10(p-i);
n/=10;
}
Однако при этом над исходным числом дважды выполняется ряд сходных операций: сначала для определения порядка числа, затем для определения отдельных цифр.
Есть способ лучше. Представим итоговое число так:
4321= ((((4)*10+3)*10+2)*10+1)
Тогда,
выделяя цифру, сразу помещаем ее в разряд единиц результирующего числа;
повышаем разрядность этого числа, умножая его на 10;
затем повторяем те же действия, пока все цифры не будут выбраны.
Исходное число |
Цифра числа |
обратное число |
1234 |
1234%10=4 |
s=4 |
123 |
123%10=3 |
s=s*10+3= 4*10+3=43 |
12 |
12%10=2 |
s=s*10+2= 43*10+2=432 |
1 |
1%10=1 |
s=s*10+1= 432*10+1=4321 |
Программа будет следующей:
# include<stdio.h>
main()
{
int n; // исходное число
int s=0; // обратное число
printf("\n введите n\n");
scanf("%d",&n);
while(n>0)
{
s=s*10+n%10;
n/=10;
}
printf("\n обратное число =%d",s);
}
3.
Дано натуральное число n. Верно ли, что это простое число.
В качестве ответа ожидается словесное сообщение. Чтобы программа выдала правильный ответ, необходимо определить переменную, которая одним своим значением указывала бы на истинность утверждения, а другим - на ложь. Поскольку язык Си не предусматривает использование логического типа, то для этих целей введем некоторую переменную-признак типа int. Ее значение будет равно: 0 - ложь, 1 - истина.
Решим задачу, исходя из определения простого числа. Простым называется натуральное число от 2 и более, которое делится на 1 и на само себя, не делясь при этом ни на какое другое число без остатка.
Следовательно, если мы будем делить число n на все числа из диапазона от 1 до n, то без остатка оно разделится ровно два раза. Однако при этом необходимо ввести дополнительную переменную, которая бы подсчитывала количество таких раз.
Сократим диапазон с 1 по n до диапазона с 2 по n-1. В этом диапазоне мы не должны встретить числа, которое бы делило n без остатка. Если же это произошло, то число не простое и переменная-признак примет значение 0.
# include <stdio.h>
main()
{
int n; // исходное число
int pr=1; // переменная признак: 0 - число не простое, 1- простое
int i;
printf("\n введите n \n");
scanf("%d",&n);
for(i=2;i<n && pr; i++)
if (n%i==0)
pr=0;
if (pr)
printf("\n число - простое");
else
printf("\n число - не простое");
}
Следует сделать оговорку для примеров 1 и 2. В них введенное исходное число n в ходе решения задачи фактически теряется, в обоих случаях обращаясь в 0. Если исходное значение числа необходимо использовать в дальнейшем, позаботьтесь об этом до его «порчи», продублировав это значение в некоторой дополнительной переменной.