Помощь - Поиск - Пользователи - Календарь
Полная версия: Перевод числа из 10 в -10 систему счисления
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Рустам
в качестве основания позиционной системы счисления может быть взято отрицательное число. Например можно рассмотреть систему с основанием -10 . Любое n единственным образом представляется в виде суммы As*(-10)^S+As-1*(-10)^s-1+...+A1(-10)+A0 где 0<=Ai<=9, i=0...s. Из сказанного следует что любое целое n записывается в системе с основанием -10 в виде целого числа без знака As As-1...A1 A0

Дано целое число n. ПОстроить представлени n в системе с основанием -10 те найти соответствующие As , As-1,..,A0
amega
тоесть ты имееш ввиду просто раскласти в виде полинома?
Рустам
Цитата(amega @ 5.04.2009 16:43) *

тоесть ты имееш ввиду просто раскласти в виде полинома?


нет надо просто цифры вывести например
436 как я подсчитал уже 5*(-10)^2 + 7*(-10)^1 + 6 то есть надо эти цифры и вывести ( 5 7 6)

если надо могу выложить свою прогу которую щас сделал...почти работает но только почему то для трехзначных чисел...для остальных зацикливается
Lapp
Цитата(Рустам @ 5.04.2009 16:56) *
Дано целое число n. ПОстроить представлени n в системе с основанием -10 те найти соответствующие As , As-1,..,A0

Вот:
var
  b: array[1..100]of byte;
  i,l,d: integer;
  a,c: LongInt;

begin
  Write('Type in a number: ');
  ReadLn(a);
  l:=0;
  while a>0 do begin
    d:=a mod 10;
    a:=a div 10;
    Inc(l);
    if Odd(l) or (d=0) then b[l]:=d else begin
      b[l]:=10-d;
      a:=a+1
    end
  end;
  Write('-10 based notation: ');
  for i:=l downto 1 do Write(b[i]);
  WriteLn;
  Write('Back to normal: ');
  c:=0;
  for i:=l downto 1 do c:=c*(-10)+b[i];
  WriteLn(c)
end.
Рустам

Спасибо огромное!!! но почему для отрицательных не работает...
Lapp
Цитата(Рустам @ 6.04.2009 5:30) *
Спасибо огромное!!! но почему для отрицательных не работает...
Хм.. Про отрицательные я как-то не подумал даже.. lol.gif
Но только проблемы никакой нет. Перед началом преобразования запоминаешь знак числа a. После преобразования приписываешь его результату. Вот так примерно:
var
  b: array[1..100]of byte;
  i,l,d: integer;
  a,c: LongInt;
  s: string[1];

begin
  Write('Type in a number: ');
  ReadLn(a);
  if a<0 then begin
    s:='-';
    a:=-a
  end
  else s:='';
  l:=0;
  while a>0 do begin
    d:=a mod 10;
    a:=a div 10;
    Inc(l);
    if Odd(l) or (d=0) then b[l]:=d else begin
      b[l]:=10-d;
      a:=a+1
    end
  end;
  Write('-10 based notation: ',s);
  for i:=l downto 1 do Write(b[i]);
  WriteLn;
  Write('Back to normal: ');
  c:=0;
  for i:=l downto 1 do c:=c*(-10)+b[i];
  if s='-' then c:=-c
  WriteLn(c)
end.

(Не проверял, просто исправил)

Меня, если честно, больше смущает совсем другое - неоднозначность представления. Например:
-110 = -1-10 = 19-10
Но это, по-видимому, такое свойство системы счисления с отрицательным основанием, которое нужно просто принять, хоть оно и необычно smile.gif. Если в условии не сказано найти все представления, то все в порядке.
Рустам
Огромное спасибо)) я только сдал ту программу которая без учёта отрицательных чисел...
Кстати насчёт не однозначности...Учительница говорила с точки зрения алгебры чисел должно быть например
12(в 10) = 192(в -10)
а -12 = -192 ...вот а с точки зрения алгебры чисел -12= 28 будет неверным))) так что спасибо))
amega
ойойой а алгебра для какой системы счисления 10, дак че она приписывает ее для для -10?
с точки зрения дичитичной 1+1 =2 , а двочной 1+1=10, для каждой системы счисления своя алгебра, если взять шеснадцатиричную ... в диситичной нетже а б с д е ф, если есть неоднозначность , то нельзя ее спихивать на алгебру...


Lapp
Цитата(Рустам @ 8.04.2009 19:32) *
я только сдал ту программу которая без учёта отрицательных чисел...

А почему отрицательные не прокатили? blink.gif

Цитата(Рустам @ 8.04.2009 19:32) *
Кстати насчёт не однозначности...Учительница говорила с точки зрения алгебры чисел должно быть например
12(в 10) = 192(в -10)
а -12 = -192 ...вот а с точки зрения алгебры чисел -12= 28 будет неверным))) так что спасибо))
Не совсем понял тебя. Напиши основания во втором равенстве (кстати, используй тэг SUB для индексов). Я говорил про то, что одно и то же число (просто число, без привязки к системе счисления, как пять пирожков) в СС с основанием -10 может иметь больше, чем одно представление. В пример привел минус единицу (что означает, что ты должен один пирожок Пете). Это число в СС-10 представляется двумя способами: как -1-10 и как 19-10.
Но, повторяю, я не вижу тут большого греха. Никто не обязывал СС быть однозначной. Просто лишний повод не пользоваться этой СС на практике)).

Стоп.. Если убрать запись с лидирующим минусом, то однозначность восстановится.. Ага, понял. Ты это имел в виду? Поэтому отрицательные не прокатили? Тебе годится только запись без минуса?.. Хорошо, я напишу прожку..

Цитата(amega @ 8.04.2009 21:10) *
с точки зрения дичитичной 1+1 =2 , а двочной 1+1=10, для каждой системы счисления своя алгебра, если взять шеснадцатиричную ... в диситичной нетже а б с д е ф, если есть неоднозначность , то нельзя ее спихивать на алгебру...
amega, потрудись вникнуть перед тем, как отвечать в тему. Речь совершенно не об этом.
Lapp
Цитата(Lapp @ 8.04.2009 23:43) *
запись без минуса?.. Хорошо, я напишу прожку.
Вот, написал.. Если честно - недоволен своим творением. Все как-то через ж..
Суть такова: если число меньше нуля, то я конструирую число p+a, где p - минимальная нечетная степень десяти, превосходящая |a|. Это число я перевожу в СС-10. А число (-p) в СС-10 будет представлено единицей в нечетной позиции. Сложить числа (p+a) и (-p) будет означать просто добавить единицу в ту самую нечетную позицию. Это я и делаю.
var
  b: array[1..100]of byte;
  i,l,d,q: integer;
  a,c,p: LongInt;
  Neg: boolean;

begin
  Write('Type in a number: ');
  ReadLn(a);
  Neg:=a<0;
  if Neg then begin
    a:=-a;
    p:=10;
    q:=1;
    while p<a do begin
      p:=p*100;
      q:=q+2
    end;
    a:=p-a
  end;
  l:=0;
  while a>0 do begin
    d:=a mod 10;
    a:=a div 10;
    Inc(l);
    if Odd(l) or (d=0) then b[l]:=d else begin
      b[l]:=10-d;
      a:=a+1
    end
  end;
  if l=0 then begin
    l:=1;
    b[1]:=0
  end;
  if Neg then begin
    l:=q+1;
    if l<q then b[q]:=0;
    b[l]:=1;
  end;
  Write('-10 based notation: ');
  for i:=l downto 1 do Write(b[i]);
  WriteLn;
  Write(' Back to normal: ');
  c:=0;
  for i:=l downto 1 do c:=c*(-10)+b[i];
  WriteLn(c)
end.

Должен быть более логичный способ, не так сильно зависящий от знака числа. Он же, думаю, и более простой. Но слова "более простая программа" абсолютно не значат, что ее проще написать.. smile.gif

Да, и еще один исправил баг: если введенное число было равно нулю, то вообще ничего не выводилось. В принципе, это правильно, но лучше все же придерживаться общепринятых обозначений smile.gif.
volvo
Андрей, что-то не так...

Type in a number: 124
-10 based notation: 284
Back to normal: 124

Type in a number: -12
-10 based notation: 1028
Back to normal: -1012

Type in a number: -10
-10 based notation: 10
Back to normal: -10

Type in a number: -451
-10 based notation: 1669
Back to normal: -451

Почему -10 восстанавливается нормально, -451 тоже. А все числа в интервале (-91) .. (-11) - нет?.
Lapp
Цитата(volvo @ 9.04.2009 13:20) *
-10 восстанавливается нормально, -451 тоже. А все числа в интервале (-91) .. (-11) - нет?.
Хм.. интересно...
Сейчас проверю.
Рустам
Ничё се прожку я дал....Спасибо всем огромное я сдал прогу уже давно!!! Lapp тебе отдельное) за первую прогу я её и то и сдал)) ...после 50 минут "общения" с преподом... Сдал бы и за 10 минут если бы она не посмотрела на запись "Back to normal" а так спасибоsmile.gif Щас мучают другие головные боли с более сложными темами буду разбираться...
Lapp
Цитата(Рустам @ 10.04.2009 22:07) *
я сдал прогу уже давно!!! Lapp тебе отдельное) за первую прогу я её и то и сдал)) ...после 50 минут "общения" с преподом... Сдал бы и за 10 минут если бы она не посмотрела на запись "Back to normal"
Рустам, сдал или не сдал - это твои проблемы. Ты родил тему - дальше она живет сама. А для меня, например, неверно решенная задача - это заноза в за*нице..)) К тому же, я не припомню, чтобы СС с отрицательным основанием засвечивались тут, на Форуме. Так что не серчай, решение я добил. Всего-то нужно было сконцентрироваться и заставить себя исходить из самых общих принципов..

Трюк с конструированием числа p+a не проходит, увы. Ошибка в том, что в его записи может быть цифр больше, чем я думал, и сложение не будет столь простым; и это настолько существенно, что зарубает всю идею на корню. Я сделал совершенно новое решение, которое работает на общем принципе позиционных систем (деление и остаток). Это решение, как и полагается, нечувствительно к знаку числа, то есть одинаково работает и для положительных, и для отрицательных. Исключением по-прежнему является ноль, который приходится добавлять искуственно)).
var
  b: array[1..100]of byte;
  i,l,d: integer;
  a,c: LongInt;

begin
  Write('Type in a number: ');
  ReadLn(a);
  l:=0;
  while a<>0 do begin
    d:=a mod(-10);
    a:=a div(-10);
    if d<0 then begin
      d:=10+d;
      Inc(a)
    end;
    Inc(l);
    b[l]:=d
  end;
  if l=0 then begin
    l:=1;
    b[1]:=0
  end;
  Write('-10 based notation: ');
  for i:=l downto 1 do Write(b[i]);
  WriteLn;
  Write(' Back to normal: ');
  c:=0;
  for i:=l downto 1 do c:=c*(-10)+b[i];
  WriteLn(c);
  ReadLn
end.


А старые два решения пусть останутся памятником вечной идее перехитрить самого себя..))

Добавлено через 3 мин.
Кстати, а чем не понравилось "back to normal"? Проверка никогда не вредит. Здесь, как видишь, помогла (спасибо volvo)).

И еще интересное замечание: оказывается, система с отрицательным основанием вообще не требует лидируещего минуса в звписи числа! У меня это с трудом укладывается башке: с одной стороны, минус вроде как совсем не нужен уже, а с другой - само основание как-то же надо записывать! Если записать его в той же самой СС-10, то получится просто 10, - и что дальше?.. С одной стороны это вроде и правильно, с другой - это же не десятка на самом деле! blink.gif В этом месте меня плющит.. Я не знаю, насколько это плохо, но что-то явно нехорошо. Вроде бы нормально, что основание СС нельзя записать цифрой той же СС, но тут еще и знак приплелся, и крыша окончательно едет.. Кто-нить может внести ясность? smile.gif
Рустам
Как мне объясняли... что вот в 10 системе.. 123 например 1*102+2*101+3*100

а вот -123 в -10 это -1*1*102+2*101+3*100 вот это всё что я уяснил из её рассказа.) Не знаю насколько это верно...всё таки учитель можно доверять ...наверное...
Lapp
Цитата(Рустам @ 11.04.2009 10:01) *
Как мне объясняли... что вот в 10 системе.. 123 например 1*102+2*101+3*100
Безусловно верно.

Цитата(Рустам @ 11.04.2009 10:01) *
а вот -123 в -10 это -1*1*102+2*101+3*100 вот это всё что я уяснил из её рассказа.)
Либо ты плохо уяснил, либо плохой рассказ был..

Цитата(Рустам @ 11.04.2009 10:01) *
Не знаю насколько это верно...всё таки учитель можно доверять ...наверное...
угу, наверное.. Доверяй да проверяй.

Значица так, смотри и запоминай smile.gif
-123-10 = -( 1*(-10)2+2*(-10)1+3*(-10)0 )
- и никак иначе.

А если ты хочешь число -12310 представить в СС-10, то ты (как ты и писал в своем самом первом мессадже) должен найти соответствующие кэффициенты (проще гря, цифры). Именно это и делает моя программа. Причем, как для отрицательных, так и для положительных, и вполне успешно smile.gif (пока никто не нашел ошибки)))
Рустам
Ууу да я отсюда больше узнаю чем от нашей училки)) спасибо)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.