PDA

View Full Version : [Q] Làm thế nào để tạo ra một kiểu dữ liệu số cực lớn ?



khanh_phunhuan
02-12-2002, 14:24
Xin hãy chỉ nguyên tắc và phương pháp để tạo ra một kiểu dữ liệu số mới có phạm vi biểu diễn còn lớn hơn cả kiểu dữ liệu lớn nhất trong Turbo C++ 3.0 (long double - 80 bits). Xin nói cụ thể , tốt nhất là kèm theo ví dụ (một đoạn chương trình chẳng hạn) chứ đừng nói chung chung. Cảm ơn các vị !

khôngtên
02-12-2002, 18:07
Bác cứ dùng CTDL động chẳng hạn như danh sách liên kết... !
Bác cho tôi mail đi tôi gưởi cho ! Nhưng nói trước mã nguồn là pascal đấy nhưng bác có thể chuyển qua C hay C++ dễ dàng !

khanh_phunhuan
02-12-2002, 23:10
Cảm ơn bạn trước !
Xin bạn hãy gửi đến khanh_phunhuan@fptnet.com.vn cho tôi càng sớm càng tốt. Tôi đang cần gấp.

White_Rose
03-12-2002, 08:09
Này sao không attach vào bài viết luôn nhỉ

khanh_phunhuan
03-12-2002, 13:22
Bạn có cái tên rất đẹp nhưng chữ ký của bạn thì quá tệ . Nếu là đám con trai chúng ta thì còn có thể xuê xoa cho tính bốc đồng của nhau , nhưng nếu là con gái thì sẽ có ác cảm khủng khiếp với kiểu chữ ký ấy . Trên tinh thần góp ý bạn bè , tôi đề nghị bạn đổi chữ ký cho lịch sự hơn. Hoan hô White_rose.

danceswithwolves
03-12-2002, 15:37
trời, không để ý... khanh_phunhuan@ nói chí phải. Cứ thế này buộc lòng dww@ phải cho tất cả bài postz của WR@ vào sọt rác.

White_Rose
05-12-2002, 01:02
hu hu :(( xin lỗi mọi người. WR quên logout nên bị mất pass chứ có phải là WR post đâu.
Đúng là oan thị kinh :(
Một lần nữa xin lỗi mọi ngưòi!

vo_danh_khach
05-12-2002, 13:04
hơ hơ sao không post lên mà phải gửi qua mail???
ban chi can copy code thoi mà, chứ gửi qua mail thì ....... cũng khó chịu chứ đâu có gi hay.
Khôngtên post lên đi, cho mọi người vao DDTH cùng xem với, nếu gửi qua mail thì mìh thấy chủ nghĩa cá nhân quá

khanh_phunhuan
07-12-2002, 20:37
Sao chờ lâu quá mà không thấy khongten gửi source code cho tôi như đã hứa vậy . Tôi vẫn đang cần những chỉ dẫn về vấn đề đó đây. Khongten làm ơn gửi cho tôi source code đi. Cảm ơn.

khôngtên
07-12-2002, 22:24
Tôi đã post bài lên lần trước rồi mà ! Sao lai vào lần này chẳng thấy đâu cả ! Không sao tôi post lại các bác nhé !

Với chương trình dưới đây có thể thực hiện chia hai số có tỉ chữ số nó chỉ phụ thuộc vào phần cứng máy bạn thôi ! Nối chung để sử lý được như các số thực thì đòi hỏi nhiều vấn đề hơn nưa trong chương trình chỉ thực hiện với các số lớn ! Còn như các phép cộng, trừ, nhân không khó lắm nên tôi không post lên đây !

Const
inp='SoKL.inp';
out='SoKL.out';

Type
chuso=0..9;
mangso=array[1..1] of chuso;

Var
a,b,c:^mangso;

ma,mb,ta,tb,tc:longint;
(*cấp vùng nhớ chứa mảng số*)
Procedure GetMemory;
Var
f:text;
s:string;
i:longint;
Begin
assign(f,inp);
reset(f);
ma:=0;
mb:=0;
repeat
readln(f,s);
ma:=ma+length(s);
until s='';
repeat
readln(f,s);
mb:=mb+length(s);
until s='';
close(f);
getmem(a,ma);
getmem(b,mb);

getmem(c,ma);

End;

(*giải phóng vùng nhớ*)

Procedure FreeMemory;

Begin

freemem(a,ma);

freemem(b,mb);

freemem(c,ma);

End;

(*đọc dữ liệu*)

Procedure GetData;

Var

f:text;

s:string;

so:chuso;

i:longint;

code:integer;

Begin

assign(f,inp);

reset(f);

ta:=0;

tb:=0;

b^[tb]:=0;

repeat

readln(f,s);

for i:=1 to length(s) do

begin

val(s[i],so,code);

inc(ta);

â[ta]:=so;

end;

until s='';

repeat

readln(f,s);

for i:=1 to length(s) do

begin

val(s[i],so,code);

inc(tb);

b^[tb]:=so;

end;

until s='';

close(f);

End;

(*so sánh 2 dãy số a[x]..a[y] và b[1]..b[tb]*)

Function Ss(x,y:longint):boolean;

Var

ok,kt:boolean;

i,j:longint;

Begin

if y-x+1>tb then ok:=true

else

if (y-x+1ta) then ok:=false

else

begin

ok:=true;

kt:=true;

i:=x;

j:=1;

while kt and (i<=y) do

if â[i]>b^[j] then kt:=false

else

if â[i]

begin

kt:=false;

ok:=false;

end

else

begin

inc(i);

inc(j);

end;

end;

ss:=ok;

End;

(*dãy số a[x]..a[y] trừ dãy số b[1]..b[tb]*)

Procedure Tru(x,y:longint);

Var

nho:byte;

i,j:longint;

Begin

nho:=0;

j:=tb;

for i:=y downto x do

begin

if â[i]-b^[j]-nho<0 then

begin

â[i]:=â[i]+10-b^[j]-nho;

nho:=1;

end

else

begin

â[i]:=â[i]-b^[j]-nho;

nho:=0;

end;

dec(j);

end;

End;

(*thực hiện phép chia*)

Procedure Chia;

Var

i,j,thuong:longint;

Begin

tc:=0;

i:=1;

j:=tb;

if not ss(i,j) and (j>=ta) then exit;

while not ss(i,j) do inc(j);

repeat

thuong:=0;

while ss(i,j) do

begin

tru(i,j);

inc(thuong);

while (â[i]=0) and (i

end;

inc(tc);

c^[tc]:=thuong;

repeat

inc(j);

if (j<=ta) and (not ss(i,j)) then

begin

inc(tc);

c^[tc]:=0;

end;

until ss(i,j) or (j>ta);

until not ss(i,ta) or (j>ta);

End;

(*ghi kết quả ra file*)

Procedure To_File;

Var

f:text;

i,j:longint;

Begin

assign(f,out);

rewrite(f);

if tc=0 then

begin

writeln(f,0);

writeln(f);

for i:=1 to ta do

begin

write(f,â[i]);

if i mod 70=0 then writeln(f);

end;

end;

if tc<>0 then

begin

for i:=1 to tc do

begin

write(f,c^[i]);

if i mod 70=0 then writeln(f);

end;

writeln(f);

if i mod 70<>0 then writeln(f);

j:=1;

while (â[j]=0) and (j

for i:=j to ta do

begin

write(f,â[i]);

if (i mod 70)=0 then writeln(f);

end;

end;

close(f);

End;

(*chương trình chính*)

BEGIN

GetMemory;

GetData;

Chia;

To_File;

FreeMemory;

END.

khanh_phunhuan
09-12-2002, 15:17
Thank Noname very much!

minhbeo
23-12-2002, 19:35
Xin chào tất cả !
Vấn đề này tôi đã có làm một ví dụ nhỏ tính 2 mũ n với n nguyên dương tuỳ ý. Nhưng cũng khá lâu rồi nên không còn nhớ kỹ lắm. Thôi thì cứ gởi nguyên cả bài lên để các bạn tham khảo :
(Lưu ý sau khi biên dịch bạn cần sửa lỗi error 200 trước khi chạy)
Program Tinh2mu;
uses crt;
type kc=-1..9;
pn=^no;
no=record
va:kc;
next:pn
end;
Var fn,ln,he:pn;
i,mul,add,di:word;
n:real;
procedure init(var head:pn);
begin
new(head);head^.va:=-1;
head^.next:=head;
end;
procedure insertnode(var p:pn;
val:kc);
var z:pn;
begin
new(z);z^.va:=val;
z^.next:=p^.next;
p^.next:=z;p:=z;
end;
procedure writeval(he:pn);
var p,q:pn;
begin
p:=he;q:=he;
while p^.next<>he do
p:=p^.next;
write(p^.va);he:=p;
while he^.va<>-1 do
begin
while p^.next<>he do
p:=p^.next;
he:=p;
if he^.va=-1 then exit;
write(he^.va);
end
end;
BEGIN
init(he);ln:=he;fn:=he;
insertnode(ln,2);
write(' So mu (lon hon hoac = 0) = ');readln(n);
if n=0 then begin write('2^0 = 1');halt; end;
if n<0 then begin write('so mu <0 khong tinh');halt; end;
for i:=1 to trunc(n-1) do
begin
di:=0;add:=0;
while ln<>he do
begin
mul:=ln^.va*2+di;
di:=mul div 10;
ln^.va:=mul mod 10;
fn:=ln;ln:=ln^.next;
end;
if di<>0 then
insertnode(fn,di);
ln:=he^.next;fn:=he;
end;
writeval(he);
readln
END.