Циклические, повторяющиеся много раз однотипные вычисления позволяют наилучшим образом продемонстрировать вычислительные возможности компьютеров. Ради этого их изначально и создавали. В задачах этого раздела желательно снова перечитать параграф 5.4 из праймера посвященный «итерационным операторам» (так они назвали семейство из нескольких операторов цикла). Часть 5.4.3 можете пока пропустить, поскольку мы еще не изучали структур данных для которых … Continue reading →
Для решения задачи мы условно разделяем исходную последовательность действительных чисел на две подпоследовательности.: [latex]{a}_{1},\ldots,{a}_{15}[/latex] и [latex]{a}_{16},\ldots,{a}_{30}[/latex]. Длина подпоследовательностей в два раза меньше длины исходной последовательности. Таким образом, разность индексов элементов, которые необходимо перемножить, равна длине подпоследовательности. Тогда перемножаем необходимые элементы и находим минимальное значение из полученных результатов.
Вычислите с точностью [latex]\varepsilon[/latex] значение функции [latex]f(x)=e^x[/latex]. При вычислениях допустимо использовать только арифметические операции.
Входные данные:
В единственной строке указаны два числа, разделенные пробелом: аргумент функции [latex]x[/latex] и точность [latex]\varepsilon[/latex].
Тесты:
Входные данные
Выходные данные
[latex]x[/latex]
[latex]\varepsilon[/latex]
Результат
1
0.1
2.70833
1
0.001
2.71825
12
0.072
2.4155e+07
Решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <cmath>
usingnamespacestd;
intmain(){
doublex,e;
cin>>x>>e;
doubleresult=1;
doublecomponent=1;
for(inti=1;abs(component)>=e;i++)
{
component*=(x/i);
result+=component;
}
cout<<result<<endl;
return0;
}
Описание решения:
Для нахождения значения функции [latex]f(x)=e^x[/latex] (экспоненты) с точностью [latex]\varepsilon[/latex] воспользуемся формулой разложения Тейлора: [latex]f(x)=e^x=1+\frac{x}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!}+\cdots =\sum_{n=0}^{x^n}, x\in \mathbb{C}[/latex]. Запишем рекуррентное соотношение для нахождения каждого последующего члена: [latex]x_{n}=x_{n-1}\cdot\frac{x}{n}[/latex].Для нахождения искомого результата, будем прибавлять к значению [latex]result[/latex] новые члены до тех пор, пока они по модулю не станут меньше, чем [latex]\varepsilon[/latex].
Реализуйте структуру данных «очередь«. Напишите программу, содержащую описание очереди и моделирующую работу очереди, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:
push n
Добавить в очередь число n (значение n задается после команды). Программа должна вывести ok.
pop
Удалить из очереди первый элемент. Программа должна вывести его значение.
front
Программа должна вывести значение первого элемента, не удаляя его из очереди.
size
Программа должна вывести количество элементов в очереди.
clear
Программа должна очистить очередь и вывести ok.
exit
Программа должна вывести bye и завершить работу.
Размер очереди должен быть ограничен только размером доступной оперативной памяти. Перед исполнением операций front и popпрограмма должна проверять, содержится ли в очереди хотя бы один элемент. Если во входных данных встречается операция frontилиpop, и при этом очередь пуста, то программа должна вместо числового значения вывести строку error.
Входные данные
Описаны в условии. См. также пример входных данных.
Выходные данные
Описаны в условии. См. также пример выходных данных.
Тесты
№
Входные данные
Выходные данные:
1
push 1
front
exit
ok
1
bye
2
size
push 1
size
push 2
size
push 3
size
exit
0
ok
1
ok
2
ok
3
bye
Код программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream>
#include <string>
#include <exception>
usingnamespacestd;
structnode{
intvalue;
node*next;
node():value(0),next(NULL){}
node(intvalue,node*next)
:value(value),next(next){}
};
struct_queue{
int_size;
node*first;
node*last;
_queue():_size(0),first(NULL),last(NULL){}
voidpush(intv){
node*new_node=newnode(v,last);
if(_size==0){
first=last=new_node;
}
else{
last->next=new_node;
last=new_node;
}
_size++;
}
voidpop(){
if(_size>0){
intval=first->value;
first=first->next;
_size--;
cout<<val;
}
elsethrow0;
}
voidfront(){
if(_size>0)cout<<first->value;
elsethrow0;
}
intsize(){
return_size;
}
voidclear(){
while(_size>0){
node*new_node=first->next;
delete first;
first=new_node;
_size--;
}
first=NULL;
last=NULL;
}
};
intmain()
{
_queueq;
strings;
intn;
while(cin>>s){
if(s=="size"){
cout<<q.size()<<endl;
}
if(s=="push"){
cin>>n;
q.push(n);
cout<<"ok"<<endl;
}
if(s=="pop"){
try{
q.pop();
}
catch(inte){cout<<"error";}
cout<<endl;
}
if(s=="front"){
try{
q.front();
}
catch(inte){cout<<"error";}
cout<<endl;
}
if(s=="clear"){
q.clear();
cout<<"ok"<<endl;
}
if(s=="exit"){
cout<<"bye"<<endl;
return0;
}
}
return0;
}
Алгоритм решения:
Каждый элемент (узел) очереди состоит из информационной части (его значение) и адресной. В адресную часть первого элемента записываем адрес следующего элемента и т.д., тем самым мы создаем порядок следования элементов в очереди, связывая их между собой. При добавлении или удалении элемента мы соответственно изменяем размер очереди, который изначально равен нулю, а также меняем позиции указателей на начало и конец очереди. В условии задачи сказано, что если во входных данных встречается операция
front или
pop, и при этом очередь пуста, то программа должна вместо числового значения вывести строку
error. Поэтому создаем исключительную ситуацию для проверки наличия в очереди хотя бы одного элемента.
Ссылка на засчитанное решение на e-olymp Ссылка на условие задачи Ссылка на решение задачи на ideone.com
Задача. Найдите закономерность и напишите программу, которая выводит аналогичную таблицу для любых чисел [latex]m>0[/latex] (количество столбцов) и [latex]n>0[/latex] (количество строк). При чем [latex]k<m[/latex]. Многоточие означает продолжение последовательности.
Для решения данной задачи введем дополнительную переменную [latex]l[/latex], которая будет накапливать в себе количество напечатанных символов в строке. Каждое число в строке повторяется дважды, следовательно печатать будем число, равное целой части [latex]\left( l\div 2 \right)[/latex].
Обратим внимание на начало каждой строки. В каждой следующей строке мы сдвигаем последовательность на одно число вправо. Тогда значение переменной [latex] l[/latex] на второй строке должно быть максимально возможным [latex]\left(k\cdot2 \right)[/latex] и уменьшаться на единицу при каждом переходе на следующую строку.
Для заданных [latex]m[/latex] и [latex]n[/latex] вычислить число сочетаний [latex]C_m^n[/latex] непосредственно: [latex]C_m^n=\frac{m!}{n!(m-n)!}[/latex] и по рекуррентным формулам:
Вычислите с точностью [latex]\varepsilon[/latex] значение функции [latex]f\left( x \right) = \text{sh}x[/latex]. При вычислениях допустимо использовать только арифметические операции.
Входные данные
В одной строке задано два числа [latex]x[/latex] и [latex]E[/latex].
Выходные данные
В одной строке вывести значение функции [latex]f\left( x \right) = \text{sh}x[/latex] и [latex]\text{sinh}x[/latex] (для проверки).
[latex]\text{sh} \left( x \right) = x — \frac {x^{3}}{3!}+\frac{x^{5}}{5!} — \cdots = \displaystyle\sum_{n=0}^{\infty}\frac{1}{(2n+1)!}x^{ 2n+1 },x\in{C}[/latex]
Тесты
Входные данные
Выходные данные
(мои и стандартной функции)
1.57 1e-10000
2.2993 2.2993
3.14 1e-100000
11.5303 11.5303
0 0.1
0 0
1.05 1e-1000
1.25386 1.25386
0.785 0
0.868144 0.868144
0.52 0.01
0.543435 0.543754
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cmath>
usingnamespacestd;
intmain(){
inti=0;
doublex,E;
cin>>x>>E;
doublesh=x,a=x;
while((a*=(x*x/(2*i+2)/(2*i+3)))>E){
sh+=a;
i++;
}
cout<<sh<<' '<<sinh(x);
return0;
}
Решение
Для того чтобы найти с точностью значение функции, в данном варианте это [latex]f\left( x \right) = \text{sh}x[/latex] — гиперболический синус, надо воспользоваться рядом Тейлора. Находим следующий член ряда Тейлора и прибавляем к функции и так пока не дойдем до члена, который будет меньше, либо равен точности. Чтобы проверить на правильность наших вычислений можно воспользоваться уже готовой функцией нахождения гиперболического синуса [latex]\text{sinh}x[/latex]. Код программы
Найдите закономерность и напишите программу, которая выводит аналогичную таблицу для любых чисел [latex]n > 0[/latex] (количество столбцов) и [latex]m > 0[/latex] (количество строк).
if(j+g(c)>n){// если текущее число Фибоначчи выходит за предел строки
cout<<c/f(g(c)-n+j);// печатаем ту часть что не выходит за ее предел
h(i,j,a,b,a1,b1);
}
elseif(i<=m){
cout<<c;
j+=g(c);
}
}
return0;
}
Решение
Несложно догадаться что данная последовательность чисел это числа Фибоначчи. Для того чтобы построить таблицу надо сначала найти числа Фибоначчи (у меня это — [latex]a,b,c[/latex]), после печатаем их в строку далее переходим на новую строку и начинаем со 2 элемента относительно предыдущей строки это выполняет функция [latex]h[/latex], и так пока [latex]i \le m[/latex]. Но может возникнуть проблема с выходом за предел строки и для того чтобы этого не произошло нам нужны функции [latex]f[/latex], которая возводит 10 в заданную степень, это нам надо чтобы отрезать то что выходит за предел строки, для этого используем целочисленное деление на 10 в нужной степени, и [latex]g[/latex], которая считает количество цифр в данном числе Фибоначчи, для того чтобы определить в какую степень нам надо возвести 10, чтобы оставить только ту часть что не выходит за предел строки. Код программы
Вычислите с точностью значение функции . При вычислениях допустимо использовать только арифметические операции.
Решение
Функцию [latex]f(x)=\tan x [/latex] можно представить в виде: [latex]f(x)=\frac{\sin x}{\cos x}[/latex]
(по свойствам тангенса). Поэтому будем раскладывать в ряд две функции: [latex]\sin x[/latex] и [latex]\cos x[/latex].
Для решения задачи необходимо воспользоваться формулой Тейлора с опорной точкой (ряд Маклорена). Для функции [latex]f(x)=\sin x[/latex] она имеет следующий вид:
При помощи функции fmod удалим период, так как тангенс [latex]\pi[/latex] периодичная функция.
Затем необходимо накапливать сумму текущих членов ряда для синуса и косинуса соответственно до тех пор, пока слагаемое не будет меньше заданной точности.
Вычислите с точностью [latex]\varepsilon[/latex] cумму ряда [latex]\sum\limits_{i=1}^{\infty}{\frac{2^i}{i!}}[/latex]
Тесты
Точность
Сумма
0.00001
6.38905
Алгоритм решения
Сначала находим отношение двух соседних членов ряда. Это [latex]2/(i+1)[/latex]. Дальше в цикле for прибавляем значение очередного элемента к переменной [latex]sum[/latex] до тех пор, пока очередной элемент не станет меньше заданной точности. Значение [latex]sum[/latex] равно двум, так как при [latex]i=1[/latex] значение суммы равно 2.
cin>>E;//вводим точность, с которой будут происходить вычисления //если точность равна 1 то сумма последовательности
if(E==2||E==1)cout<<2<<endl<<3;//если точность равна 1 или 2 по сумма будет равнна сумме двух первых членов последовательности
elseif(E<1){
for(inti=3;a>=E;i++){//задаем цикл:пока следующее слагаемое больше точности
fib3=fib1+fib2;
a=i/fib3;//слагаемое
sum+=a;
fib1=fib2;
fib2=fib3;
//k++; //считаем количество слагаемых, для того чтобы потом проверить результат
}
//cout<<k<<endl;
cout<<sum;
}
return0;
}
Решение
Предлагаю следующее решение. Вычисляем первые два члена суммы:[latex]\sum _{i=1}^{2}{\frac{i}{fib(i)}}=1+\frac{1}{2}[/latex]. Каждое следующее слагаемое находим по формуле [latex]\frac{i}{fib(i)}[/latex] и записываем в переменную [latex]a[/latex], которую прибавляем к переменной [latex]sum[/latex], где хранится сумма, известная нам на данный момент (изначально это сумма первых двух членов) . [latex]fib_1[/latex] и [latex]fib_2[/latex] это два последних числа Фибоначчи, которые нам нужны для вычисления следующего [latex]fib_3[/latex]. Продолжаем искать слагаемые пока следующее слагаемое больше точности [latex]\varepsilon [/latex]. Вводим дополнительную переменную [latex]k[/latex] для того чтоб сосчитать количество слагаемых. Затем можно проверить правильность вычислений тут, подставляя [latex]k[/latex] как количество слагаемых.
Туристическая фирма не успела из-за больших морозов продать [latex]n[/latex] ([latex]n < 15[/latex]) путёвок на горнолыжные базы, срок действия которых уже наступил. С целью уменьшения убытков, было решено с 1 февраля все такие путёвки, которым осталось [latex]d_k[/latex] ([latex]d_k \le 30[/latex]) дней, продавать по номинальной стоимости – по [latex]c_k[/latex] ([latex]c_k \le 100[/latex]) грн за день только за те дни, что остались со дня продажи ([latex]k = 1..n[/latex]).
На какую наибольшую сумму можно реализовать эти путёвки, если каждый день продавать по одной путёвке?
Входные данные
Первая строка содержит количество путёвок [latex]n[/latex]. Каждая из следующих [latex]n[/latex] строк содержит два числа – количество дней [latex]d_k[/latex] и стоимость дня [latex]c_k[/latex].
Выходные данные
Максимальная сумма прибыли.
Алгоритм решения
Решим эту задачу полным перебором (методом грубой силы). Для этого необходимо перебрать все возможные варианты реализации. К примеру, дано три путевки:
Первая путёвка
срок действия: 2
номинальная стоимость: 13
Вторая путёвка
срок действия: 1
номинальная стоимость: 33
Третья путёвка
срок действия: 3
номинальная стоимость: 7
Надо перебрать все возможные варианты и для каждого подсчитать сумму за реализованные путевки.
Путевки
Перебор всех возможных вариантов
Вариант 1
Вариант 2
Очередность
Результат
Очередность
Результат
Первая
1
20
1
20
Вторая
2
3
Третья
3
2
Вариант 3
Вариант 4
Очередность
Результат
Очередность
Результат
Первая
2
53
2
20
Вторая
1
3
Третья
3
1
Вариант 5
Вариант 6
Очередность
Результат
Очередность
Результат
Первая
3
40
3
7
Вторая
1
2
Третья
2
1
Теперь очевидно, что максимальная сумма прибыли равна 53. Таким образом можно решить данную задачу при любых входных данных. Но возникает проблема, когда путевок слишком много (или даже не очень). Количество перестановок для [latex]n[/latex] элементов равно [latex]n![/latex]. Это значит, что при количестве путевок, равном [latex]14[/latex] (максимальное возможное количество в данной задаче), количество перестановок равно [latex]14! = 87178291200[/latex], а ведь для каждой необходимо подсчитать сумму за реализованые путевки. Современные компьютеры не могут справиться с этой задачей за короткий промежуток времени, поэтому явным решением является оптимизация программы.
Давайте представим, что мы имеем две путевки, сроки действия которых равны единице. Очевидно, что одну из них мы точно не успеем реализовать, так как продав одну, срок действия другой на следующий день истечет, а, так как реализовать путевки необходимо за наибольшую сумму, то реализовать нужно ту, чья номинальная стоимость выше. Отсюда следует, что, когда есть две путевки, сроки действия которых равны единице, более дешевую можно игнорировать. Теперь, пусть у нас есть три путевки, сроки действия которых равны двум. Аналогично рассуждая, можно прийти к выводу, что в такой ситуации путевку с самой низкой номинальной стоимостью можно игнорировать. Это же верно для четырех, пяти и т.д. путевок. Тогда нам остается перед началом полного перебора отсечь путевки, не влияющие на ответ, при этом сократив время выполнения в разы.
Наиболее простым решением данной задачи оказалось рассмотреть котангенс, как отношение косинуса к синусу и работать не с рядом Тейлора для котангенса, а с рядами Маклорена для синуса и косинуса. Причем, удобно работать с ними в одном цикле. Оказывается, слагаемые этих рядов можно получить друг из друга.
Ряд Маклорена для синуса: [latex]\sin{x}= [/latex] [latex] x — \frac{x^{3}}{3!} + \frac{x^{5}}{5!} — [/latex] …
Ряд Маклорена для косинуса: [latex]\cos{x}= [/latex] [latex]1 — \frac{x^{2}}{2!} + \frac{x^{4}}{4!} — [/latex] …
Отсюда видно, что [latex]n[/latex]-е слагаемое ряда для синуса равно [latex] n[/latex]-ому слагаемому ряда для косинуса, умноженному на [latex] \frac{x}{2 \cdot n+1} [/latex]. Запускаем цикл, работающий, пока модуль разности между предыдущим и следующим значением котангенса больше заданной точности, в котором каждый раз прибавляем к рядам их следующие слагаемые.
В функции int main() считаем количество знаков числа, которое нам нужно вывести, через цикл, а затем пользуемся функцией precision и выводим результат.
Примечание: Поскольку в условии разрешается пользоваться только арифметическими операциями, а модуль не совсем является таковой, я не стал пользоваться стандартной функцией Abs(), а вписал в программу ее замену.
Найдите закономерность и напишите программу, которая выводит аналогичную таблицу для любых чисел (количество столбцов) и (количество строк). Замечание 1. В некоторых задачах появляется дополнительный параметр . Замечание 2. Многоточие означает продолжение последовательности Совет. Если закономерность разгадать не получается, попробуйте воспользоваться Онлайн-энциклопедией целочисленных последовательностей.
C++
1
2
3
4
5
6
7
8
9
10
12
+-------+-------+-------+
|123...k|k...321|123...k|
|23...k1|1k...32|23...k1|
|3...k12|21k...3|3...k12|
|.......|.......|.......|
|k123...|...321k|k123...|
+-------+-------+-------+
|123...k|k...321|123...k|
|23...k1|1k...32|23...k1|
Тесты
n
m
k
Результат
15
9
4
C++
1
2
3
4
5
6
7
+----+----+----
|1234|4321|1234
|2341|1432|2341
|3412|2143|3412
|4123|3214|4123
+----+----+----
|1234|4321|1234
10
7
3
C++
1
2
3
4
5
6
7
+---+---+-
|123|321|1
|231|132|2
|312|213|3
+---+---+-
|123|321|1
|231|132|2
12
5
2
C++
1
2
3
4
5
+--+--+--+--
|12|21|12|21
|21|12|21|12
+--+--+--+--
|12|21|12|21
25
15
7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+-------+-------+-------+
|1234567|7654321|1234567|
|2345671|1765432|2345671|
|3456712|2176543|3456712|
|4567123|3217654|4567123|
|5671234|4321765|5671234|
|6712345|5432176|6712345|
|7123456|6543217|7123456|
+-------+-------+-------+
|1234567|7654321|1234567|
|2345671|1765432|2345671|
|3456712|2176543|3456712|
|4567123|3217654|4567123|
|5671234|4321765|5671234|
|6712345|5432176|6712345|
Код программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
usingnamespacestd;
intmain()
{
intn,m,k,j,p,z=0;
cin>>n;//количество столбцов
cin>>m;//количество строк
cin>>k;
for(inti=0;z<m;i++,z++)//перебираем строки
{
if(i==k+1)
i=0;
for(j=0;j<n;)
{
if(i%(k+1)==0)
{
cout<<'+';
j++;
for(p=1;(p<=k)&&(j<n);p++,j++)
{
cout<<'-';
}
}
else
{
cout<<'|';
j++;
for(p=i;(p<=k)&&(j<n);p++,j++)
{
cout<<p;
}
for(p=1;(p<i)&&(j<n);p++,j++)
{
cout<<p;
}
if(j<n)
cout<<'|';
j++;
for(p=i-1;(p>0)&&(j<n);p--,j++)
{
cout<<p;
}
for(p=k;(p>=i)&&(j<n);p--,j++)
{
cout<<p;
}
}
}
cout<<endl;
}
return0;
}
Решение
Закономерности в таблице
Через каждые [latex]k[/latex] строк, начиная с нулевой, встречается строка, в которой нулевой и каждый [latex]k[/latex]-й символы — «+», а остальные — «-«. Такие строки разделяют одинаковые [latex]k[/latex]-местные блоки строк.
Каждая строка блока строк содержит, в свою очередь, [latex]k[/latex]-местные блоки символов (эти блоки уже разные), разделенные символами «|». В каждой строке из блока два вида блоков символов (далее блок 1 и блок 2). Все нечетные блоки имеют вид блока 1, четные — блока 2.
Блок 1 содержит числа по возрастанию, начиная с номера строки в блоке строк, до [latex]k[/latex] включительно, т.е. числа из сегмента [latex][i ; k][/latex], где [latex]i[/latex] — номер строки в блоке строк. После них в блоке записаны числа от [latex]1[/latex] до номера строки в блоке, не включая сам этот номер, т.е. числа из полусегмента [latex][1 ; i)[/latex].
Блок 2 каждой строки содержит те же числа, что и блок 1, но записанные в противоположном порядке.
Реализация
Программа содержит один большой цикл, перебирающий строки. Причем, этот цикл содержит 2 счетчика строк — один считает номер текущей строки в таблице, а второй — в блоке строк. В этот цикл вложен цикл, перебирающий блоки, а в нем, в свою очередь, цикл, записывающий блок. Чтобы цикл вывода блоков символов (строк) не выводил лишние символы (строки), выводящие символы (строки) циклы, которые находятся внутри них, должны содержать проверку не только на окончание блока, но и на окончание таблицы (само собой, циклы, выводящие блоки тоже имеют проверку на конец таблицы).
Найдите закономерность и напишите программу, которая выводит аналогичную таблицу для любых чисел (количество столбцов) и (количество строк). Замечание 1. В некоторых задачах появляется дополнительный параметр . Замечание 2. Многоточие означает продолжение последовательности. Совет. Если закономерность разгадать не получается, попробуйте воспользоваться Онлайн-энциклопедией целочисленных последовательностей.
Входные данные:
Три числа: количество столбцов и строк, параметр [latex]k[/latex].
Выходные данные:
C++
1
2
3
4
5
6
7
8
9
+-------+-------+-------+
|123...k|123...k|123...k|
|23...k1|23...k1|23...k1|
|3...k12|3...k12|3...k12|
|.......|.......|.......|
|k123...|k123...|k123...|
+-------+-------+-------+
|123...k|123...k|123...k|
|23...k1|23...k1|23...k1|
Код программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
usingnamespacestd;
intmain()
{
intm,n,k;
cin>>m>>n>>k;
for(inti=0;i<m;i++)
{
if(i%(k+1)==0)
{
for(intj=0;j<n;j++)
{
cout<<(j%(k+1)==0?"+":"-");
}
}
else
{
for(intj=0;j<n;j++)
{
if(j%(k+1)==0)
{
cout<<"|";
}
else
{
inta=(j%(k+1)+i%(k+1)-1)%k;
cout<<(a==0?k:a);
}
}
}
cout<<endl;
}
return0;
}
Решение:
Для построения данной таблицы нужно найти закономерность чередования символов в таблице. Решение данной задачи можно осуществить с помощью двух циклов. Первый отвечает за строки, а второй — за столбцы. Пусть нумерация строк и столбцов начинается с нуля. Тогда, если номер строчки нацело делится на [latex](k+1)[/latex], то рассматриваем столбцы этой строчки. Если номер столбца нацело делится на [latex](k+1)[/latex], то записываем «+», иначе «-«. Если номер строки не делится нацело на [latex](k+1)[/latex], а номер столбца в этой строке — делится, то записываем «|». Если номер строки и столбца не делятся нацело на [latex](k+1)[/latex], то создаем переменную, с помощью которой будем заполнять таблицу цифрами. Так как, каждый столбик и каждая строка имеют свой номер, то с помощью нахождения суммы остатка от деления строки и столбца на [latex](k+1)[/latex] будем находит значение элемента, стоящего на пересечении [latex]i- [/latex]ой строки и [latex]i-[/latex]ого столбца, но этого не достаточно, в таблице есть перестановка, чтобы ее реализовать отнимаем от суммы единицу, делая этим сдвиг вправо. Также от полученного результата нужно найти остаток от деления на параметр [latex]k[/latex] для того, чтобы выполнялась правильная последовательность символов. Если результат вычисления переменной равен нулю, то записываем значение параметра [latex]k[/latex], иначе — результат вычисления переменной.
Вычислите с точностью [latex]\varepsilon[/latex] значение функции [latex]f\left( x \right) = \ln \left( 1-x^2 \right)[/latex] . При вычислениях допустимо использовать только арифметические операции.
Входные данные
В одной строке заданы значение переменной [latex]x[/latex] и точность вычислений [latex]\varepsilon[/latex].
[latex]\left | x \right |< 1[/latex]
Функцию [latex]f\left( x \right) = \ln \left( 1-x^2 \right)[/latex] можно представить в виде:
[latex]ln\left ( 1-x^2 \right )= ln\left ( 1-x \right )\left ( 1+x \right ) = ln\left ( 1-x \right )+ln\left ( 1+x \right )[/latex] (по свойствам логарифма).
Для решения задачи необходимо воспользоваться формулой Тейлора для натурального логарифма с опорной точкой [latex]x_{0}=0[/latex] (ряд Маклорена). Для функции [latex]ln\left (1+x\right )[/latex] она имеет следующий вид:
Найдите закономерность и напишите программу, которая выводит аналогичную таблицу для любых чисел [latex] n>0[/latex] (количество столбцов) и [latex]m>0[/latex] (количество строк).
Пронумеруем строки от [latex]1[/latex] до [latex]m[/latex] , столбцы — от [latex]1[/latex] до [latex]n[/latex].
1
2
3
4
5
6
7
…
n
1
1
2
3
1
2
3
1
…
…
2
2
3
1
2
3
1
2
…
…
3
1
3
2
1
3
2
1
…
…
4
1
2
3
1
2
3
1
…
…
5
2
3
1
2
3
1
2
…
…
6
1
3
2
1
3
2
1
…
…
7
1
2
3
1
2
3
1
…
…
…
…
…
…
…
…
…
…
…
…
m
…
…
…
…
…
…
…
…
…
Положение символа [latex]2[/latex] определяется однозначно для всей таблицы [latex]\left (n+m \right )\vdots 3[/latex]. В столбцах, где [latex]n\vdots 3[/latex], положение символа [latex]1[/latex] — [latex]\left ( n+m+1 \right )\vdots 3[/latex] , на оставшихся свободных местах — символ [latex]3[/latex] . В столбцах, где [latex]\left ( n-1\right )\vdots 3[/latex], на свободных местах стоит символ [latex]1[/latex]. В оставшихся столбцах на свободных местах стоит символ [latex]3[/latex].
Поскольку в данной задаче использование рекуррентной формулы приведет только к накоплению погрешности, будем считать каждое слагаемое суммы непосредственно, пока не достигнем заданной точности. Для этого зададим начальное значение переменной
exponent=M_E для [latex]i=1[/latex] , а также для первого члена ряда
а=sqrt(2)/exponent. Тогда для каждого значения счетчика нам нужного всего лишь накапливать степень экспоненты и вычислять текущий член ряда по формуле [latex]\frac{\sqrt{i+1}}{i\cdot{e}^{i}} [/latex] , накапливая сумму, пока не достигнем заданной точности эпсилон.
Проверить правильность найденной суммы можно с помощью сайта WolframAlpha.
Задача. Вычислите с точностью [latex]\varepsilon[/latex] значение функции [latex]f(x)=\csc x[/latex] . При вычислениях допустимо использовать только арифметические операции.
Косеканс — это тригонометрическая функция, которою можно определить формулой [latex]\csc x=\frac{1}{\sin x}[/latex]. Таким образом, мы можем разложить функцию [latex]\sin x[/latex] в бесконечную сумму степенных функций, воспользовавшись формулой Тейлора. Получим, что [latex]\sin x=x-\frac{{x}^{3}}{3!}+\frac{{x}^{5}}{5!}-\dots=\sum_{n=0}^{\propto}\frac{{-1}^{n}\times{x}^{2n+1}}{\left(2n+1\right)!}[/latex]. Слагаемые данной суммы являются геометрической прогрессией, знаменатель который можно найти по формуле [latex]\frac{a_n}{a_{n-1}}=\frac{\frac{{-1}^{n}\times{a}^{2n+1}}{\left(2n+1 \right)!}}{\frac{{-1}^{n-1}\times{a}^{2n-1}}{\left(2n-1 \right)!}}=\frac{\left( -1\right){a}^{2}}{2n\times\left( 2n+1\right)}[/latex]. Будем вычислять сумму до тех пор, пока разность [latex]n[/latex]-го и [latex]\left ( n+1 \right )[/latex]-го слагаемых будет больше заданной точности.
Найдите закономерность и напишите программу, которая выводит аналогичную таблицу для любых чисел [latex]n > 0[/latex] (количество столбцов) и [latex]m > 0[/latex] (количество строк). Замечание 1. В некоторых задачах появляется дополнительный параметр [latex]k < n[/latex]. Замечание 2. Многоточие означает продолжение последовательности Совет. Если закономерность разгадать не получается, попробуйте воспользоваться Онлайн-энциклопедией целочисленных последовательностей.
Дано [latex]m[/latex] строк, в каждой из которых определены последовательности, каждая из которых состоит из чисел, возрастающих от 1 до [latex]k[/latex], затем спадающих до 1 и знак «+». Закономерность данной задачи состоит в последовательном сдвиге вправо каждой последующей строки и её выведении с элемента стоящего на первом месте.
Последовательность знаков каждой строки повторяется через каждые [latex]2k[/latex] знаков. Именно поэтому на [latex]2k[/latex]-ом месте будет стоять «+» (так как отсчёт начинается с 1, а не с 0).
Определяем первый знак каждой строки сравнением номера строки [latex]i[/latex] с [latex]k[/latex]: если он меньше или равен [latex]k[/latex], то он и будет первым знаком данной строки, в противном случае — первым знаком будет [latex](2k — i)[/latex].
Затем выводим цифры каждой строки:
если цифра, с которой ведётся отсчёт данной строки, меньше [latex]k[/latex], то увеличиваем каждую последующую цифру (за «+» следует 1 и далее аналогично этому условию);
если цифра равна [latex]k[/latex], то уменьшаем последующие цифры.
Найти закономерность и написать программу, которая выводит аналогичную таблицу для любых чисел (количество столбцов) и (количество строк).
Замечание 1. В некоторых задачах появляется дополнительный параметр .
1
2
3
4
5
6
7
8
9
10
11
12
13
+++++++++++++++++++++++++++++++
+....^....+....^....+....^....+
+....|....+....|....+....|....+
+<--k-->+<--k-->+<--k-->+
+....|....+....|....+....|....+
+....v....+....v....+....v....+
+++++++++++++++++++++++++++++++
+....^....+....^....+....^....+
+....|....+....|....+....|....+
+<--k-->+<--k-->+<--k-->+
+....|....+....|....+....|....+
+....v....+....v....+....v....+
+++++++++++++++++++++++++++++++
Тесты
Входные данные
Выходные данные
m
n
k
13
31
9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
+++++++++++++++++++++++++++++++
+.........+.........+.........+
+.........+.........+.........+
+.........+.........+.........+
+.........+.........+.........+
+.........+.........+.........+
+++++++++++++++++++++++++++++++
+.........+.........+.........+
+.........+.........+.........+
+.........+.........+.........+
+.........+.........+.........+
+.........+.........+.........+
+++++++++++++++++++++++++++++++
5
8
4
C++
1
2
3
4
5
++++++++
+....+..
+....+..
+....+..
+....+..
20
20
3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
++++++++++++++++++++
+...+...+...+...+...
+...+...+...+...+...
+...+...+...+...+...
+...+...+...+...+...
+...+...+...+...+...
++++++++++++++++++++
+...+...+...+...+...
+...+...+...+...+...
+...+...+...+...+...
+...+...+...+...+...
+...+...+...+...+...
++++++++++++++++++++
+...+...+...+...+...
+...+...+...+...+...
+...+...+...+...+...
+...+...+...+...+...
+...+...+...+...+...
++++++++++++++++++++
+...+...+...+...+...
Алгоритм
Программа выполняется с помощью двух циклов. Первый цикл отвечает за строки, второй за столбцы. Метод заключается в том, чтобы узнать, когда мы записываем именно ‘+’, а уже в остальные места записываем ‘.’. Для начала проверяем делится ли номер строки, уменьшенный на 1, нацело на 6. Если да, то записываем +. Далее проверяем, делится ли номер столбца, уменьшенный на 1, на число [latex]k+1[/latex], где [latex]k[/latex] — вводимый параметр. Во всех остальных случаях пишем ‘.’.