Поиск фальшивой монеты - 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.

Объяснение кода листинга программы

  1. Объявлены константы и переменные:
    • 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 (переменная для подсчета количества весов)
  2. Выполняется функция s(t; ts, te): integer
    • Результат функции равен сумме элементов массива t с ts до te
  3. Выполняется цикл по монетам:
    • Для каждой монеты выводится ее номер и количество
  4. Начинается поиск фальшивой монеты с помощью вложенных циклов:
    • Переменные i и j используются для определения текущего диапазона для сравнения
    • Переменная p используется для подсчета количества весов
  5. В каждой итерации находится серединная монета 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
  6. После нахождения фальшивой монеты выводится сообщение с номером этой монеты и количеством весов.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы