Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОНТРОЛЬНАЯ_РАБОТА_Лабораторный практикум Алгор...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
521.22 Кб
Скачать

Задания

  1. Вычислить значение K:

K =

  1. Вычислить значение N:

N =

  1. Вычислить значение K:

K =

  1. Даны числа a и b. Вычислить значение K:

K =

  1. Дано целое число n. Вычислить значение K:

K =

  1. Даны числа a и b. Вычислить значение K:

K = где P =

  1. Даны натуральные числа a и b. Вычислить значение N:

N = где P =

  1. Дано число m. Вычислить значение K:

K = где P = m2+m

  1. Даны целые числа 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. Если исходное значение числа необходимо использовать в дальнейшем, позаботьтесь об этом до его «порчи», продублировав это значение в некоторой дополнительной переменной.