Tải bản đầy đủ (.doc) (23 trang)

Xây dựng chương trình xử lý số nguyên lớn

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (111.17 KB, 23 trang )

PHẦN I: TỔNG QUAN
I.GIỚI THIỆU TỔNG QUAN:
Có thể nói trong thời đại ngày nay, với sự phát triển nhanh chóng của công nghệ thông
tin và một số lĩnh vực khác như :toán học, thiên văn học,…thì chúng ta phải đối mặt với
việc phải tính toán những số liệu có thể lớn nhỏ khác nhau và đối với một số lĩnh vực số
liệu nhỏ và ít thì ta có thể dung máy tính xách tay để tính toán. Nhưng máy tính xách tay
chỉ giúp chúng ta tính toán những con số có độ dài chừng vài số đến vài chục số, còn trên
thực tế như lĩnh vực thiên văn học, hóa học,vật lí, nguyên tử…, thì những con số cần được
tính toán rất lớn và những số rất lớn như vậy được người ta đặt cho một tên gọi chung là
“Số Nguyên Lớn”. Trong chương trình học của chúng ta thì chúng ta đã được giới thiệu
các kiểu khai báo như: kiểu INT và giá trị tối đa từ -32768 đến 32767 tương ứng với (2
byte), kiểu short thì giá trị tối đa từ -32768 đến 32767 tương ứng với (2 byte), kiểu LONG
thì giá trị tối đa từ -2147483648 đến 214783647 tương ứng với (2 byte), kiểu UNSIGUED
thì giá trị tối đa từ 0 (byte) đến 255 (byte), kiểu FLOAT thì chứa tối đa từ 1,2E-38 đến
3,4E+38 tương ứng với (4 byte), kiểu DOUBLE thì chứa tối đa từ 2,2E-308 đến 1,8E+308
tương ứng với (8 byte), LONG DOUBLE thì chứa tối đa 3,4E-4932 đến 1,8E+4932 tương
ứng với (10 byte)…
Với tất cả các kiểu biến ở trên, thì ta có thể tính toán được những con số nhỏ, vừa, và
tương đối lớn. Còn đối với những con số cực lớn thì những kiêu khai báo trên không thể
nào chứa nổi, vì vậy đòi hỏi chúng ta phải thiết kế một chương trình (giải thuật) để xử lý
những con số đó.
Số nguyên lớn là một lĩnh vực mặc dù con người quan tâm từ rất sớm, nhưng đến nay
để giải quyết trọn vẹn bài toán đó còn là một vấn đề đang được nghiên cứu. Riêng em, hiện
đang là một sinh viên năm 3, với lượng kiến thực còn hạn hẹp của mình,và giới hạn về mặt
thời gian của niên luận này và đây cũng là lần đầu tiên em nghiên cứu một đề tài có tính
chất khoa học nên không tránh khỏi những sai sót. Em xin chân thành biết ơn sự hướng
dẫn hết lòng của giáo viên hướng dẫn.
Rất mong nhận được sự góp ý vô cùng quí báu của quí thầy cô, cùng toàn thể các bạn
để chương trình của em được hoàn thiện hơn.
II. MỤC TIÊU VÀ HƯỚNG GIẢI QUYẾT
1. MỤC TIÊU CẦN ĐẠT ĐƯỢC


a) Lý thuyết:
- Phải nắm vững và hiểu rỏ sử dụng thành thạo ngôn ngữ lập trình C. Đặt biệt là
kiểu con trỏ (danh sách lien kết đơn), khai báo khiểu cấu trúc, kiểu chuỗi…
trong cơ sở dữ liệu.
- Nắm rỏ cách thức tính cộng và trừ hai số nguyên.
- Phải tìm ra thuật toán đơn giản nhất mà hiệu quả.
b) Chương trình Demo:
- Trương trình phải dể sử dụng, cung cấp giao diên thân thiện với người dùng.
- Cho phép tính toán một số nguyên lớn bất kì.
- Kết quả tính toan luôn chính xác.
2. HƯỚNG GIẢI QUYẾT
- Dữ liệu dược nhập vào từ bàn phím ( dữ liệu đầu vào la một chuổi số).
- Chuyển đổi chuổi vừa nhập thành từng số nguyên, cất từng số nguyên vào danh
sách liên kết đơn.
- Sử dụng những chương trình được cài đặc để xử lý.
- Kết quả xuất ra là tổng và hiệu hai số nguyên lớn.
PHẦN II: ỨNG DỤNG
I.CƠ SỞ LÝ THUYẾT:
Được sự hướng dẫn của giáo viên cùng với sự tìm tòi cùa bản thân thì em nhận thấy
danh sách lien kết đơn phù hợp với yêu cầu của bài toán, vì trong danh sách liên kết đơn thì
không giới hạn số phần tử không cần phải cấp phát ô nhớ trước dùng đến đâu thì cấp phát đến
đó. Vì vây chúng ta không gặp phải trường hợp bị tràn hay bị thừa bộ nhớ …
Trong quá trình thực hiện đề tài em có sử dụng một số hàm thư viện có sẵn trong cấu
trúc dữ liệu. Bên cạnh đó em cũng đã tự thiết kế nên một số chương trình con đễ đáp ứng và
giải quyết vấn đề cộng và trừ hai số nguyên lớn.
II. CHƯƠNG TRÌNH CON MỘT SỐ HÀM TỰ ĐỊNH NGHĨA VÀ MỘT SỐ HÀM
THƯ VIÊN
1. Cấu trúc dữ liệu mới:
Cài đặt cấu trúc node trong danh sách liên kết
typedef struct node

{
elementtype element;
node* next;
node* prev;
}
2. Các chương trình con tự định nghĩa và lưu đồ khối kèm theo:
a) Hàm đếm chiều dài của chuổi số nguyên:
- Đoạn code của hàm:
int dem(list l)
{
position p;
p= first(l);
int s=0;
while(p!=end(l))
{
s=s+1;
p=p->next;
}
return s;
}
- Lưu đồ khối của hàm:
b) Hàm đảo chuổi số nguyên:
- Đoạn code của hàm:
void dao(list l)
{
list ld;
makenulllist(&ld);
position p;
p= first(l);
elementtype x;

while(p!= end(l))
{
insertlist(retrieve(p,l),first(ld),&ld);
p=p->next;
}
printf("\n\n day so vua nhap la:");
printlist(ld);
printf("\n\n");
}
P= first(l) ;s=0;
Begin
P!=end(l)
s=s+1 ; p=p->next
End
đúng
sai
- Lưu đồ khối của hàm:
c) Hàm hiệu chuổi a và b:
- Đoạn code của hàm:
void hieu(list l1,list l2,list *l4)
{
position p,q,c,d;
p= first(l1);
begin
p!=first(l1)
p!=end(l1)
insert(retrieve(p,l),first(ld),&ld)
p=p->next
printlist(ld)
end

đúng
sai
q= first(l2);
c= end(l1);
d= end(l2);
int H;
if(dem(l1)>dem(l2))
tru(l1,l2,l4);
else if(dem(l1)<dem(l2))
{
printf("\n -"); tru(l2,l1,l4);
}
else if(dem(l1)==dem(l2))
{
while(p!=end(l1))
{
if(retrieve(p,l1)!=retrieve(q,l2))
{
H=1;break;
}
else if(retrieve(p,l1)==retrieve(q,l2))
{
H=0;
p=p->next;
q=q->next;
}
}
if(H==0)
{
printf("\n\t 0 (Hai so vua nhap bang nhau!!)");

getch();
}
while(d!=first(l2))
{
if((retrieve(c,l1))<(retrieve(d,l2)))
{
printf("\n - "); tru(l2,l1,l4);break;
}
else if(retrieve(c,l1)>retrieve(d,l2))
{
tru(l1,l2,l4);break;
}
c=c->prev;
d=d->prev;
}
}
}
- Lưu đồ khối của hàm:
begin
P= first(l1) ; q=first(l2)
dem(l1)>dem(l2)
A
tru(l1,l2,l4)
dem(l1)<dem(l2)
printf(“ - “)
tru(l2,l1,l4)
dem(l1)=dem(l2)
đúng
đúng
đúng

sai
sai
p!=end(l1)
daoluon(&l1)
A
daoluon(&l2)
retrieve(p,l1)!=retrieve(q,l2)
H =0
H=1;
break;
p=p->next;q=q->next; H=0
0
en
d
đúng
đúng
đúng
sai
sai
sai
B
B
retrieve(p,l1)>retrieve(q,l2)
daoluon(&l1)
daoluon(&l2)
tru(l1,l2,l4)
retrieve(p,l1)<retrieve(q,l2)
daoluon(&l1)
daoluon(&l2)
tru(l2,l1,l4)

printf(“ - “)
đúng
đúng
sai

×