Текущий архив: 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.52 MB
Время: 0.009 c