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!
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.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.