• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Проверьте почему не работает правильно

  • Автор темы Автор темы icewind
  • Дата начала Дата начала

icewind

Новые
Регистрация
1 Май 2012
Сообщения
17
Реакции
0
Баллы
0
Проверьте почему не работает правильно

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:=temp mod 3 ;
If D=2 then d:=-1;
temp:=(temp-D) 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 набуває одне з трьох значень -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.
 
Написав свою програму. Ось вона. Нехай комп'ютер сам вважає ваги гир - він залізний.
Код:
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);
  [COLOR=Red]If counter<=Max_W then
[/COLOR]    Res[counter]:=q;
  m:=m div 3;
  if q=-1 then m:=m-q;
 Until (q=1) and (counter>1);
 Write(m0,' = ');
 [COLOR=Red]If counter<=Max_W then[/COLOR]
  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.
 
Трохи виправив. Виділено червоним кольором.
 
Назад
Сверху