Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Вниз

любые числа +-*:   Найти похожие ветки 

 
Vlad Oshin ©   (2006-06-17 18:56) [0]

кому делать мало..
меня не пинать - просто подкмалось вдруг

function MyByte(ch:char):byte;
begin
case ch of
"0":result:=0;
"1":result:=1;
"2":result:=2;
"3":result:=3;
"4":result:=4;
"5":result:=5;
"6":result:=6;
"7":result:=7;
"8":result:=8;
"9":result:=9;
end;
end;

function MyChar(b:byte):char;
begin
case b of
0:result:="0";
1:result:="1";
2:result:="2";
3:result:="3";
4:result:="4";
5:result:="5";
6:result:="6";
7:result:="7";
8:result:="8";
9:result:="9";
end;
end;

function Madd(N1,N2:string):string;
label 1,2;
var
 N3:string;
 b:byte;
 j:longint;
 t1:byte;
 t2,t3:byte;
begin
1:
 if length(N1)>length(N2) then begin
                                 N2:="0"+N2;
                                 goto 1;
                               end;
2:
 if length(N1)<length(N2) then begin
                                 N1:="0"+N1;
                                 goto 2;
                               end;
  N3:=N1;
  b:=0;
  for j:=length(N1) downto 1 do begin
  t1:=MyByte(N1[j]);
  t2:=MyByte(N2[j]);
  t3:=(t1+ t2 ) mod 10;
    N3[j]:=MyChar(t3+b);
     b:=(t1+ t2) div 10;
                                end;
  N3:=inttostr(b)+N3;
  if N3[1]="0" then delete(N3,1,1);
  result:=N3;
end;

неправильно.
Ну и где натупил?
А Кто сделает остальное? :)


 
Vlad Oshin ©   (2006-06-17 18:57) [1]

99+1=не правильно
просто, для разминки


 
tButton ©   (2006-06-17 19:00) [2]

function MyByte(ch:char):byte;
begin
result:=ord(ch)-ord("0");
end;

function MyChar(b:byte):char;
begin
result:=chr(ord("0")+b);
end;


 
atruhin ©   (2006-06-17 19:01) [3]

function MyByte(ch:char):byte;
begin
 result := byte(ch)-byte("0");
end;
обратная аналогично


 
tButton ©   (2006-06-17 19:03) [4]

1:
if length(N1)>length(N2) then begin
                                N2:="0"+N2;
                                goto 1;
                              end;
2:
if length(N1)<length(N2) then begin
                                N1:="0"+N1;
                                goto 2;
                              end;


while length(N1)>length(N2)
 do N2:="0"+N2;
while length(N2)>length(N1)
 do N1:="0"+N1;


 
Vlad Oshin ©   (2006-06-17 19:05) [5]

сказал же - не пинать ?)
спасибо

ну а дальше?


 
tButton ©   (2006-06-17 19:08) [6]

складывание целых чисел в строках N1 И N2

N3:="";
a:="0";
for i:=length(N1) downto 1 do begin
 b1:=MyByte(N1[i]);
 b2:=MyByte(N2[i]);
 r:=b1+b2+a;
 p:=r mod 10;
 N3:=MyChar(p)+N3;
 a:=r-p;
end;
if a>0 then N3:=IntToStr(a)+N3;


 
tButton ©   (2006-06-17 19:10) [7]


> сказал же - не пинать ?)

не пинаю, это совет по оптимизации =)

комментарий к складыванию
в переменной "а" запоминаем часть которая больше 10
прибавляем её в следующем сложении
и не забываем её прибаить после того как сложились все разряды
больше 9 там получиться не может, но на всякий случай использовал IntToStr

давай уже проверь эту хреновину на работоспособность =)
а то меня обламывает =)


 
TUser ©   (2006-06-17 19:11) [8]

> function MyByte(ch:char):byte;
> begin
> case ch of
> "0":result:=0;
> "1":result:=1;
> "2":result:=2;
> "3":result:=3;
> "4":result:=4;
> "5":result:=5;
> "6":result:=6;
> "7":result:=7;
> "8":result:=8;
> "9":result:=9;
> end;
> end;

ShowMessage (inttostr(MyByte("0")));
ShowMessage (inttostr(MyByte("O")));

Что будет? + функция ord рулит.


 
atruhin ©   (2006-06-17 19:14) [9]

> [6] tButton ©   (17.06.06 19:08)

Сильно не вникал, но строки по длинне 0 выравнивать нужно точно.
a : integer;


 
Servelat ©   (2006-06-17 19:15) [10]


> Что будет? + функция ord рулит.

а что будет в первоначальном варианте? ^^


 
tButton ©   (2006-06-17 19:17) [11]

если r<10
то r mod 10 = r
=>
0<=a<10

про выравнивание не понял
while сначала проверяет условие потом выполняет итерацию
если перед первой итерацией условие не выполняется - не выполнится ни одной итерации


 
TUser ©   (2006-06-17 19:18) [12]

> а что будет в первоначальном варианте? ^^

Та же фигня. Два раза ноль покажет. А надо - во второй раз ошибку выдать - ведь там не ноль, а о.


 
tButton ©   (2006-06-17 19:18) [13]

кхм, а что будет в
>tButton ©   (17.06.06 19:00) [2]


 
Vlad Oshin ©   (2006-06-17 19:19) [14]


> tButton ©

меня тоже

все напрочь забыл
procedure TForm1.Button2Click(Sender: TObject);
begin
//                  label1.Caption:=inttostr(ord("5")-48);
//trunc
//round
///n3[j]- т3хо
end;
такой ....
занимаюсь :)


 
TUser ©   (2006-06-17 19:19) [15]

Будет выдано число, возможно большее 9. Или меньшее.


 
tButton ©   (2006-06-17 19:21) [16]


> Будет выдано число, возможно большее 9. Или меньшее.

логично, а если защита от дурака встроена выше?
имхо, нет резона встраивать её в код функции столь низкого уровня
это должно проверяться на уровне ввода данных


 
Vlad Oshin ©   (2006-06-17 19:22) [17]


> TUser ©   (17.06.06 19:18) [12]


точно


 
tButton ©   (2006-06-17 19:28) [18]

хорош придираться "99"+"1" сколько получается?


 
atruhin ©   (2006-06-17 19:30) [19]

> [11] tButton ©   (17.06.06 19:17)

Ну посмотри что будет если N2 короче чем N1


 
Vlad Oshin ©   (2006-06-17 19:33) [20]


> atruhin ©   (17.06.06 19:30) [19]

выравниваем же

это...
кто скажет как надо?

диплом, все такое прочее было

просто интересуюсь
а давайте напишем
+
-
*
:
?

спасибо - приз.


 
tButton ©   (2006-06-17 19:36) [21]

while length(N1)>length(N2)
do N2:="0"+N2;
while length(N2)>length(N1)
do N1:="0"+N1;

N1="123456";
N2="1234";

// первый цикл
1. length(N1)=6, length(N2)=4; (true)
1.1. N2="01234";
2. length(N1)=6; length(N2)=5; (true);
2.1. N2="001234";
3. length(N1)=6, length(N2)=6; (false);
// второй цикл
4. length(N1)=6, length(N2)=6; (false);


 
Vlad Oshin ©   (2006-06-17 19:37) [22]


> "99"+"1" сколько получается

100

а ка доказать?


 
tButton ©   (2006-06-17 19:40) [23]

полный листинг:


// функции преобразования
function MyByte(ch:char):byte;
begin
result:=ord(ch)-ord("0");
end;

function MyChar(b:byte):char;
begin
result:=chr(ord("0")+b);
end;

// функция вычисления
function Madd(N1,N2:string):string;
var
 N3:string;
 b1, b2, r, p, a:byte;
 i:longint
begin
while length(N1)>length(N2)
 do N2:="0"+N2;
while length(N2)>length(N1)
 do N1:="0"+N1;
N3:="";
a:="0";
for i:=length(N1) downto 1 do begin
 b1:=MyByte(N1[i]);
 b2:=MyByte(N2[i]);
 r:=b1+b2+a;
 p:=r mod 10;
 N3:=MyChar(p)+N3;
 a:=r-p;
end;
if a>0 then N3:=IntToStr(a)+N3;
result:=N3;
end;


 
Vlad Oshin ©   (2006-06-17 19:48) [24]

ну а теперь осталось 3 операции дописать
* следует из +
и т.п.


 
tButton ©   (2006-06-17 19:49) [25]

компильнул
исправил кой что

function Madd(N1,N2:string):string;
var
 N3:string;
 b1, b2, r, p, a:byte;
 i:longint;
begin
while length(N1)>length(N2)
 do N2:="0"+N2;
while length(N2)>length(N1)
 do N1:="0"+N1;
N3:="";
a:=0;
for i:=length(N1) downto 1 do begin
 b1:=MyByte(N1[i]);
 b2:=MyByte(N2[i]);
 r:=b1+b2+a;
 p:=r mod 10;
 N3:=MyChar(p)+N3;
 a:=r div 10;
end;
if a>0 then N3:=IntToStr(a)+N3;
result:=N3;
end;

работает как часы

-*/ - в другой раз
сейчас баиньки пора =)


 
tButton ©   (2006-06-17 19:51) [26]

в геодезии нас учили складывать и вычитать с права налево
так что более-менее простой алгоритм вычитания у меня есть =)


 
Vlad Oshin ©   (2006-06-17 19:57) [27]

почему то
":0"

значит псирх. проблемы
неправда_все
деньги берут а толков -0


 
Servelat ©   (2006-06-17 22:58) [28]


> кто скажет как надо?
>
> диплом, все такое прочее было


Я, в пору нужды, дулал так:

исходные строки инвертировал (abcd=dcba), потом складывал по порядку без запарок, ответ инвертировал назад =) гораздо удобне для понимания имхо, хотя можно замутить оптимизацию чтобы строки не переворачивать, но кому это надо :D


 
tButton ©   (2006-06-18 02:09) [29]


>  но кому это надо :D

тому у кого реально длинные строки
тем более, переворачивание - не наглядно


 
Delphi basic ©   (2006-06-19 15:55) [30]


> Vlad Oshin ©   (17.06.06 18:56)  

Я как-то реализовал работу с "большими" числами. Просто еще в школе зацепила задачка вроде "Определите какую-то там цифру десятичной записи факториала такого-то числа". Ежли интересно, могу скинуть текст модуля. Длинные числа реализовал как строки (как-то ломало со сдвигами через asm работать), хотя места бы в разы меньше занимали. В общем, написал я этот модуль, посчитал факториал 1000 и на этом успокоился :)



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.008 c
4-1144177949
leonidus
2006-04-04 23:12
2006.07.16
Как проверить CRC своего же екзешника?


15-1150365896
DillerXX
2006-06-15 14:04
2006.07.16
У вас работает ICQ?


6-1141971797
WondeRu
2006-03-10 09:23
2006.07.16
TServerSocket внутри COM-сервера.


1-1149342991
malyar
2006-06-03 17:56
2006.07.16
ПОСЫЛКА СООБЩЕНИЯ КОМПОНЕНТУ LISTVIEW


1-1148703455
tio
2006-05-27 08:17
2006.07.16
MDI правильное закрытие окон и исчезновением их





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский