Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 10.05.2012, 17:25   #1 (permalink)
icewind
Member
 
Регистрация: 01.05.2012
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Проверьте почему не работает правильно

2.1 Постановка задачі
ТЕРЕЗИ
Є терези і набір гир масою 1,3,9,27,…,3^(n-1)кг, причому кожна гиря в єдиному екземплярі. На ліву шальку терезів кладуть предмет масою m кг
(0 <=m<=3). Потрібно розподілити гирі на терезах так, щоб досягти балансу. Не обов 'язково використовувати всі гирі.

2.2 Задача на мові Free Pascal

Program Scles;
Cont
Weight:Array[0..19] of longint
=(1,3,9,27,81,243,729,2187,6561,19683,59049,
177147,531441,1594323,4782969,14348907,
43046721,129140163,387420489,1162261467);
Var m,n temp,i,j:longint;
d:Array[0..20] of -1..1;
begin
Assign(input,'Input.txt');
reset(Input);
Readln(m,n);
Close(Input);
temp:=m;
i:=1;
While temp>0 do
begin
D[i]:=temp mod 3 ;
If D[i]=2 then d[i]:=-1;
temp:=(temp-D[i]) div 3;
Inc(i)
end;
Assign(Output,'Output.txt');
Rewrite(Output);
Write(m);
Writeln;
Close(output);
end.


3.1 Опис вхідних і вихідних даних
Формат вхідних даних: у першому рядку файла lnput.txt — числа m і
n (n < 20) (цілі невід'ємні),розділені символом «пробіл».
Формат вихідних даних: у першому рядку файла Output.txt — число
m i маси гир на лівій шальці в порядку зростання. У другому рядку —
маси гир на правій шальці терезів у порядку зростання.
Приклад введення і виведення даних:
lnput.txt Output.txt
5 3 5 1 3
9

3.2 Етапи розробки програми
Домовимось укладання гир на ліву шальку кодувати
«-1», а на праву — «1». Невикористана гиря буде кодуватися нулем. Тоді
розв'язком задачі буде число m, переведене у так звану врівноважену
трійкову систему числення:
m = d[0]*1 + d[1]*3 + d[2]*З2 +... + d[k]*Зk, (1).
де кожен з коефіцієнтів d[i] набуває одне з трьох значень -1, 0 або 1.
Відмінність від звичайної трійкової системи в тому, що в цій системі
замість цифр 0,1 і 2 використовуються цифри 0,1 і -1.
Розглянемо алгоритм запису числа m у зрівноваженій трійковій системі числення:
• знаходимо залишок від ділення числа m на 3;
• якщо залишок дорівнює 2, то заміняємо його на -1;
• зменшуємо m на щойно отриманий залишок і беремо цілу частину від ділення на 3 - нове значення m (у звичайній трійковій системі беремо тільки цілу частину від ділення m на 3);
• повторюємо ці дії, доки m > 0.
Очевидно, що цей процес скінченний. Залишається розподілити гирі на терезах: на ліву шальку терезів кладемо масу m і, відповідно, ті гирі, біля яких у співвідношенні (1) стоїть коефіцієнт -1, а на праву кладемо ті гирі
для яких відповідний коефіцієнт дорівнює 1. Відповідно гирі з коефіцієнтом 0 не використовуємо. Так, для наведеного в умові тесту матимемо співвідношення:
5= —1*1±1*3 + 1*32,
а для m = 10 наступне 10= 1*1 + 0*3 + 1*32.
icewind вне форума   Ответить с цитированием

Старый 10.05.2012, 17:25
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Я уверен, проблема решиться если ознакомиться с похожими темами

Не могу понять почему не работает колонка
Почему на компьютере плохо работает интернет?
Проверьте печатку
Почему не работает, никто не знает?
Не работает Мозилла, почему?
Почему не работает Kies?

Старый 11.05.2012, 12:27   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Написав свою програму. Ось вона. Нехай комп'ютер сам вважає ваги гир - він залізний.
Код:
Var
 m0,m,Max_W,i,counter,q:Integer;
 f:Text;
 Res:Array[1..20] of ShortInt;

Function Pw3(v:byte):LongInt;
var
 t:byte;
 P:LongInt;
begin
 if v=0 then P:=1 else
 begin
  P:=1;
  for t:=1 to v do P:=P*3;
 end;
 Pw3:=P;
end;

Begin
 Assign(f,'Input.txt');
 Reset(f);
 Readln(f,m0,Max_W);
 Close(f);
 m:=m0;
 counter:=0;
 Repeat
  q:=m mod 3;
  if q=2 then q:=-1;
  Inc(counter);
  If counter<=Max_W then
    Res[counter]:=q;
  m:=m div 3;
  if q=-1 then m:=m-q;
 Until (q=1) and (counter>1);
 Write(m0,' = ');
 If counter<=Max_W then
  For i:=counter downto 1 do
   if i=counter then write(Pw3(i-1)) else
   if Res[i]=-1 then write(Pw3(i-1)*Res[i]) else
   write('+',Pw3(i-1)*Res[i]);
 Assign(f,'Output.txt');
 Rewrite(f);
 If counter>Max_W then
  writeln(f,'No solution!') else
 begin
  write(f,m0);
  for i:=1 to counter do
   if Res[i]=-1 then write(f,' ',Pw3(i-1));
  writeln(f);
  for i:=1 to counter do
   if Res[i]=1 then write(f,' ',Pw3(i-1));
 end;
 Close(f);
 Readln;
End.
Vladimir_S вне форума   Ответить с цитированием
Старый 11.05.2012, 15:13   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Трохи виправив. Виділено червоним кольором.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 05:36.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.