Поиск фальшивой монеты - 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
- После нахождения фальшивой монеты выводится сообщение с номером этой монеты и количеством весов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д