?>
2. В программе My7_2 реализован процесс, относительно которого выдвинута так называемая гипотеза Сиракуз. Это процесс последовательного преобразования натурального числа n в 1. Запустив программу, проверяем ее работу при не- скольких значениях n и видим, что предусмотренный резуль- тат каждый раз достигается. Отсюда мы делаем предположе- ние, что работа программы завершится, то есть результат будет получен при любом значении n. Однако с достовернос- тью это неизвестно, доказательство факта завершения работы программы (алгоритма) при любом значении n до сих пор ни- кем не получено7 . Другими словами, есть алгоритм (програм- ма), но его конечность, завершаемость работы во времени — открытый вопрос, требующий своего обоснования. Мораль: проверка циклов типа While требует особо тщательной рабо- ты, ибо подобные циклы «потенциально бесконечны во време- ни». Program My7_2; Var n:Integer; Begin WriteLn('Введите натуральное число:'); ReadLn(n); Write(n); While n<>1 Do Begin If n Mod 2=0 Then n:=n Div 2 Else n:=(3*n+1) Div 2; Write(' - ', n); End; ReadLn; End. Последовательно запуская программу, оцените среднюю длину получаемых цепочек чисел при изменении n от 2 до 20. Как избавиться от этой ручной работы по многократному запуску программы? Рассматривая полученные цепочки чисел, нетрудно заме- тить, что фрагменты этих цепочек часто повторяются. Напри- мер, 8421, 5168421. Как использовать этот факт при подсчете средней длины цепочек для чисел (n) из большого интервала, например типа Integer? Потребуется ли в этом случае что-либо изменять в приведенном фрагменте про- граммы?
Ответы
#include <iostream>
#include <vector>
using namespace std;
void insertionSort(vector<int> &a_){
vector<int> t;
int n = a_.size();
for(int i = 0; i < n; i++){
int u = i;
for(int j = i + 1; j < n; j++)
if(a_[j] < a_[u])
u = j;
swap(a_[i], a_[u]);
if(!(a_[i] & 1))
t.push_back(a_[i]);
}
a_ = t;
}
void solve(){
vector<int> a = {-2, 4, 10, -1, 1, 6, 3, 7, 8, 5};
insertionSort(a);
cout << "a = {";
for(int i = 0; i < a.size() - 1; i++)
cout << a[i] << ", ";
cout << a.back() << "}";
}
int main(){
solve();
}