в качестве основания позиционной системы счисления может быть взято отрицательное число. Например можно рассмотреть систему с основанием -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
5.04.2009 20:43
тоесть ты имееш ввиду просто раскласти в виде полинома?
Рустам
5.04.2009 20:47
Цитата(amega @ 5.04.2009 16:43)
тоесть ты имееш ввиду просто раскласти в виде полинома?
нет надо просто цифры вывести например 436 как я подсчитал уже 5*(-10)^2 + 7*(-10)^1 + 6 то есть надо эти цифры и вывести ( 5 7 6)
если надо могу выложить свою прогу которую щас сделал...почти работает но только почему то для трехзначных чисел...для остальных зацикливается
Lapp
6.04.2009 4:38
Цитата(Рустам @ 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>0dobegin
d:=a mod10;
a:=a div10;
Inc(l);
if Odd(l) or (d=0) then b[l]:=d elsebegin
b[l]:=10-d;
a:=a+1endend;
Write('-10 based notation: ');
for i:=l downto1do Write(b[i]);
WriteLn;
Write('Back to normal: ');
c:=0;
for i:=l downto1do c:=c*(-10)+b[i];
WriteLn(c)
end.
Рустам
6.04.2009 8:30
Спасибо огромное!!! но почему для отрицательных не работает...
Lapp
6.04.2009 11:44
Цитата(Рустам @ 6.04.2009 5:30)
Спасибо огромное!!! но почему для отрицательных не работает...
Хм.. Про отрицательные я как-то не подумал даже.. Но только проблемы никакой нет. Перед началом преобразования запоминаешь знак числа 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<0thenbegin
s:='-';
a:=-a
endelse s:='';
l:=0;
while a>0dobegin
d:=a mod10;
a:=a div10;
Inc(l);
if Odd(l) or (d=0) then b[l]:=d elsebegin
b[l]:=10-d;
a:=a+1endend;
Write('-10 based notation: ',s);
for i:=l downto1do Write(b[i]);
WriteLn;
Write('Back to normal: ');
c:=0;
for i:=l downto1do c:=c*(-10)+b[i];
if s='-'then c:=-c
WriteLn(c)
end.
(Не проверял, просто исправил)
Меня, если честно, больше смущает совсем другое - неоднозначность представления. Например: -110 = -1-10 = 19-10 Но это, по-видимому, такое свойство системы счисления с отрицательным основанием, которое нужно просто принять, хоть оно и необычно . Если в условии не сказано найти все представления, то все в порядке.
Рустам
8.04.2009 22:32
Огромное спасибо)) я только сдал ту программу которая без учёта отрицательных чисел... Кстати насчёт не однозначности...Учительница говорила с точки зрения алгебры чисел должно быть например 12(в 10) = 192(в -10) а -12 = -192 ...вот а с точки зрения алгебры чисел -12= 28 будет неверным))) так что спасибо))
amega
9.04.2009 0:10
ойойой а алгебра для какой системы счисления 10, дак че она приписывает ее для для -10? с точки зрения дичитичной 1+1 =2 , а двочной 1+1=10, для каждой системы счисления своя алгебра, если взять шеснадцатиричную ... в диситичной нетже а б с д е ф, если есть неоднозначность , то нельзя ее спихивать на алгебру...
Lapp
9.04.2009 2:43
Цитата(Рустам @ 8.04.2009 19:32)
я только сдал ту программу которая без учёта отрицательных чисел...
А почему отрицательные не прокатили?
Цитата(Рустам @ 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
9.04.2009 8:05
Цитата(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 thenbegin
a:=-a;
p:=10;
q:=1;
while p<a dobegin
p:=p*100;
q:=q+2end;
a:=p-a
end;
l:=0;
while a>0dobegin
d:=a mod10;
a:=a div10;
Inc(l);
if Odd(l) or (d=0) then b[l]:=d elsebegin
b[l]:=10-d;
a:=a+1endend;
if l=0thenbegin
l:=1;
b[1]:=0end;
if Neg thenbegin
l:=q+1;
if l<q then b[q]:=0;
b[l]:=1;
end;
Write('-10 based notation: ');
for i:=l downto1do Write(b[i]);
WriteLn;
Write(' Back to normal: ');
c:=0;
for i:=l downto1do c:=c*(-10)+b[i];
WriteLn(c)
end.
Должен быть более логичный способ, не так сильно зависящий от знака числа. Он же, думаю, и более простой. Но слова "более простая программа" абсолютно не значат, что ее проще написать..
Да, и еще один исправил баг: если введенное число было равно нулю, то вообще ничего не выводилось. В принципе, это правильно, но лучше все же придерживаться общепринятых обозначений .
volvo
9.04.2009 16:20
Андрей, что-то не так...
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
10.04.2009 4:23
Цитата(volvo @ 9.04.2009 13:20)
-10 восстанавливается нормально, -451 тоже. А все числа в интервале (-91) .. (-11) - нет?.
Хм.. интересно... Сейчас проверю.
Рустам
11.04.2009 1:07
Ничё се прожку я дал....Спасибо всем огромное я сдал прогу уже давно!!! Lapp тебе отдельное) за первую прогу я её и то и сдал)) ...после 50 минут "общения" с преподом... Сдал бы и за 10 минут если бы она не посмотрела на запись "Back to normal" а так спасибо Щас мучают другие головные боли с более сложными темами буду разбираться...
Lapp
11.04.2009 8:07
Цитата(Рустам @ 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<>0dobegin
d:=a mod(-10);
a:=a div(-10);
if d<0thenbegin
d:=10+d;
Inc(a)
end;
Inc(l);
b[l]:=d
end;
if l=0thenbegin
l:=1;
b[1]:=0end;
Write('-10 based notation: ');
for i:=l downto1do Write(b[i]);
WriteLn;
Write(' Back to normal: ');
c:=0;
for i:=l downto1do c:=c*(-10)+b[i];
WriteLn(c);
ReadLn
end.
А старые два решения пусть останутся памятником вечной идее перехитрить самого себя..))
Добавлено через 3 мин. Кстати, а чем не понравилось "back to normal"? Проверка никогда не вредит. Здесь, как видишь, помогла (спасибо volvo)).
И еще интересное замечание: оказывается, система с отрицательным основанием вообще не требует лидируещего минуса в звписи числа! У меня это с трудом укладывается башке: с одной стороны, минус вроде как совсем не нужен уже, а с другой - само основание как-то же надо записывать! Если записать его в той же самой СС-10, то получится просто 10, - и что дальше?.. С одной стороны это вроде и правильно, с другой - это же не десятка на самом деле! В этом месте меня плющит.. Я не знаю, насколько это плохо, но что-то явно нехорошо. Вроде бы нормально, что основание СС нельзя записать цифрой той же СС, но тут еще и знак приплелся, и крыша окончательно едет.. Кто-нить может внести ясность?
Рустам
11.04.2009 13:01
Как мне объясняли... что вот в 10 системе.. 123 например 1*102+2*101+3*100
а вот -123 в -10 это -1*1*102+2*101+3*100 вот это всё что я уяснил из её рассказа.) Не знаю насколько это верно...всё таки учитель можно доверять ...наверное...
Lapp
11.04.2009 13:38
Цитата(Рустам @ 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)
Не знаю насколько это верно...всё таки учитель можно доверять ...наверное...
угу, наверное.. Доверяй да проверяй.
Значица так, смотри и запоминай -123-10 = -( 1*(-10)2+2*(-10)1+3*(-10)0 ) - и никак иначе.
А если ты хочешь число -12310 представить в СС-10, то ты (как ты и писал в своем самом первом мессадже) должен найти соответствующие кэффициенты (проще гря, цифры). Именно это и делает моя программа. Причем, как для отрицательных, так и для положительных, и вполне успешно (пока никто не нашел ошибки)))
Рустам
12.04.2009 15:39
Ууу да я отсюда больше узнаю чем от нашей училки)) спасибо)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.