Поиск фальшивой монеты - Free Pascal
Формулировка задачи:
Имеется 11 монет. Золотые все. Николаевские червонцы. Среди них одна фальшивая, позолоченная. А внутри свинец. Из химии известно, что свинец легче золота. Есть аптекарские весы, точные. С двумя чашками. Программа определяет, какое минимальное число взвешиваний необходимо для определения фальшивой монеты. К тому же она указывает номер фальшивой монеты, полученный путем взвешиваний. Указание: использовать массив из 11 элементов для хранения весов монет. Вес фальшивой монеты располагать в массиве произвольно.
Решение задачи: «Поиск фальшивой монеты»
textual
Листинг программы
- {$mode objfpc}
- const n = 11;
- type ar=array[1..n] of integer;
- var
- a:ar;
- i,j,k,p:integer;
- function s(t:ar;ts,te:integer):integer;
- begin
- Result:=0;
- for ts:=ts to te do Result:=Result+t[ts];
- end;
- begin
- randomize;
- for i:=1 to n do a[i]:=1;
- a[random(n)+1]:=0;
- for i:=1 to n do write(i,':',a[i],' ');writeln;
- i:=1;j:=n;p:=0;
- repeat
- k:=i+(j-i) div 2;
- p:=p+1;
- if j-i=1 then begin
- if a[i]<a[j] then begin k:=i;break;end else begin k:=j;break;end;
- end;
- if s(a,i,k-1)=s(a,k,j-1) then begin k:=j;break;end;
- if s(a,i,k-1)<s(a,k,j-1) then j:=k-1 else begin i:=k;j:=j-1;end;
- until false;
- writeln('взвешиваний',p:3,' номер монеты',k:3);
- end.
Объяснение кода листинга программы
- Объявлены константы и переменные:
- n = 11 (количество монет)
- ar = array[1..n] of integer (тип массива для хранения количества монет)
- i, j, k, p = integer (переменные для циклов)
- a[i] = 1 (изначально все монеты считаются настоящими)
- a[random(n)+1] = 0 (одна монета выбирается как фальшивая)
- i = 1, j = n (переменные для цикла по монетам)
- p = 0 (переменная для подсчета количества весов)
- Выполняется функция s(t; ts, te): integer
- Результат функции равен сумме элементов массива t с ts до te
- Выполняется цикл по монетам:
- Для каждой монеты выводится ее номер и количество
- Начинается поиск фальшивой монеты с помощью вложенных циклов:
- Переменные i и j используются для определения текущего диапазона для сравнения
- Переменная p используется для подсчета количества весов
- В каждой итерации находится серединная монета k
- Если разница между i и j равна 1, то сравниваются значения a[i] и a[j]
- Если значения равны, то фальшивая монета находится в диапазоне от i до j-1
- Если a[i] меньше a[j], то фальшивая монета находится в диапазоне от i+1 до j-1
- Если a[i] больше или равно a[j], то фальшивая монета находится в диапазоне от i до j-2
- Если a[i] меньше a[j] и a[i+1] меньше a[j-1], то фальшивая монета находится в диапазоне от i+1 до j-1
- Если a[i] меньше a[j] и a[i+1] больше или равно a[j-1], то фальшивая монета находится в диапазоне от i до j-2
- Если a[i] больше или равно a[j] и a[i+1] меньше a[j-1], то фальшивая монета находится в диапазоне от i+1 до j-1
- Если a[i] больше или равно a[j] и a[i+1] больше или равно a[j-1], то фальшивая монета находится в диапазоне от i до j-2
- После нахождения фальшивой монеты выводится сообщение с номером этой монеты и количеством весов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д