Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.16;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.046 c
3-1147761663
mr.il
2006-05-16 10:41
2006.07.16
передать параметр в IBDataSet


6-1141675738
NKVDwnik
2006-03-06 23:08
2006.07.16
IIS


6-1142322245
SKAyeR
2006-03-14 10:44
2006.07.16
Как получить список файлов находящихся в папке на удал. web серв


3-1147356242
Boris Marchenko
2006-05-11 18:04
2006.07.16
Ошибка при залогинивании в IBConsole


1-1149287685
lamer_y
2006-06-03 02:34
2006.07.16
Проблема с TStrings