Сдать решение задачи C1-Гипотеза Коллатца Задача C1: Гипотеза Коллатца
Недавно Ваня наткнулся на интересную гипотезу, являющуюся одной из нерешенных проблем математики. Она известна под названием «гипотеза Коллатца» и заключается в следующем:
«Выберем любое натуральное число x. Если оно чётное, то поделим его на 2 (получим x / 2), а если нечётное, то умножим на 3 и прибавим 1 (получим 3x + 1). Над новым полученным числом (x / 2 или 3x + 1) выполним те же самые действия. Продолжив выполнять данные действия, рано или поздно мы получим 1, вне зависимости от изначального числа x ».
Ваня решил проверить данную гипотезу и попытаться найти контрпример для нее. Он перебрал много разных чисел, но каждый раз у него в итоге получалась 1. В какой-то момент Ваня устал и пошёл отдыхать, решив продолжить попытки опровержения гипотезы после небольшого перерыва. Но когда он снова вернулся к своим вычислениям, он обнаружил, что его младший брат пролил на бумаги с записями сок, и некоторые числа превратились в пятна. Ваня никогда не сдаётся, поэтому он решил попробовать восстановить числа, с которых начинал свои вычисления.
Ваня видит числа, с которых вычисления продолжаются, и по размеру пятна умеет вычислять, сколько именно чисел было пропущено в вычислениях. Причем он решил восстанавливать записи, исходя из предположения, что изначальное число было минимальным.
Зная количество размытых чисел N и число K, с которого продолжаются вычисления, определите минимальное число, с которого Ваня мог начинать свои вычисления.
Примечания
Пусть, например, листок с одним из вычислений выглядит как на изображении ниже.
В таком случае Ваня определит по пятну, что пропущенных чисел N = 2, и увидит, что вычисления продолжаются с числа K = 5. Так как N = 2, он мог получить K = 5 одним из двух :
20 > 10 > 5 дважды разделив на 2
3 > 10 > 5 сначала умножив на 3 и прибавив 1, а потом разделив на 2
Минимальное начальное число — 3.
Тест №1(задача C.1): N = 2, K = 7;
Тест №2(задача C.2): N = 2, K = 32;
Тест №3(задача C.3): N = 2, K = 112;
Тест №4(задача C.4): N = 3, K = 11;
Тест №5(задача C.5): N = 3, K = 47;
Тест №6(задача C.6): N = 3, K = 512;
Тест №7(задача C.7): N = 4, K = 26;
Тест №8(задача C.8): N = 4, K = 215;
Тест №9(задача C.9): N = 5, K = 100;
Тест №10(задача C.10): N = 5, K = 1000.
// PascalABC.NET 3.1, сборка 1174 от 22.02.2016
begin
Writeln(Range(1,100).Select(i->sin(i)*cos(i)).Where(x->x<>0).Average)
end.
Тестовое решение:
-0.00136006072493969
2. А вот так учат писать это же школьные учителя:
// PascalABC.NET 3.1, сборка 1174 от 22.02.2016
var
m:array[1..100] of real;
i,k:integer;
s:real;
begin
s:=0;
k:=0;
for i:=1 to 100 do begin
m[i]:=sin(i)*cos(i);
if m[i]<>0 then begin
s:=s+m[i];
k:=k+1
end
end;
Writeln(s/k)
end.
Тестовое решение:
-0.00136006072493969
//Pascal
const m = 1000
var
arr: array[1..m] of integer;
n,i, j, k: integer;
begin
readln(n);
write ('Исходный массив: ');
for i := 1 to n do begin
readln(arr[i]);
end;
//сортировка методом пузырька
for i := 1 to n-1 do
for j := 1 to n-i do
if arr[j] > arr[j+1] then begin
k := arr[j];
arr[j] := arr[j+1];
arr[j+1] := k
end;
write ('Отсортированный массив: ');
for i := 1 to n do
write (arr[i]:4);
end.
Алгоритм сортировки на классическом языке программирования С
# define SWAP(A,B) {A=A^B;B=A^B;A=A^B;}
void bubblesort(int A[], int n)
{
int i, j;
for(i = n-1 ; i > 0 ; i--)
{ for(j = 0 ; j < i ; j++)
{
if( A[j] > A[j+1] ) SWAP(A[j],A[j+1]);
}
}
}