Diễn Đàn Khoa học Máy tính - ĐH Công nghệ thông tin (ĐHQG TP HCM)
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Diễn Đàn Khoa học Máy tính - ĐH Công nghệ thông tin (ĐHQG TP HCM)

KHOA HỌC MÁY TÍNH-UIT
 
Trang ChínhTrang Chính  PortalPortal  Latest imagesLatest images  Tìm kiếmTìm kiếm  Đăng kýĐăng ký  Đăng NhậpĐăng Nhập  
Latest topics
» Hướng dẫn thao tác Số nguyên lớn!
Hướng dẫn thao tác Số nguyên lớn! I_icon_minitimeby peterdrew Thu 23 Jun 2011, 21:53

» Rèn luyện Đệ Quy với Bài tập này???
Hướng dẫn thao tác Số nguyên lớn! I_icon_minitimeby tandunglee Sun 12 Jun 2011, 09:25

» VietPon.com -Mạng giảm giá cao cấp của Nhật chính thức ra mắt
Hướng dẫn thao tác Số nguyên lớn! I_icon_minitimeby tuquynh Wed 18 May 2011, 09:10

» Một số bài hướng dẫn về Mảng!
Hướng dẫn thao tác Số nguyên lớn! I_icon_minitimeby Tesulakata Sat 16 Apr 2011, 13:48

» PHẢN XẠ NGẪU NHIÊN LIÊN TỤC-p2 Học tiếng Nhật mới
Hướng dẫn thao tác Số nguyên lớn! I_icon_minitimeby tuquynh Fri 07 Jan 2011, 17:36

» Khuyến học mừng năm mới 2011
Hướng dẫn thao tác Số nguyên lớn! I_icon_minitimeby tuquynh Fri 07 Jan 2011, 17:35

» Khai giảng khóa đàm thoại đặc biệt tại Top Globis
Hướng dẫn thao tác Số nguyên lớn! I_icon_minitimeby tuquynh Mon 11 Oct 2010, 20:31

» Học tiếng nhật miễn phí tại Top Globis
Hướng dẫn thao tác Số nguyên lớn! I_icon_minitimeby tuquynh Mon 11 Oct 2010, 20:31

» Học tiếng Nhật là niềm vui của bạn - Dạy tiếng Nhật là niềm tự hào của Top Globis.
Hướng dẫn thao tác Số nguyên lớn! I_icon_minitimeby tuquynh Mon 11 Oct 2010, 20:30

» Tài liệu học C++ làm game :D
Hướng dẫn thao tác Số nguyên lớn! I_icon_minitimeby peterdrew Fri 02 Jul 2010, 14:04


 

 Hướng dẫn thao tác Số nguyên lớn!

Go down 
Tác giảThông điệp
peterdrew
Vip
Vip
peterdrew


Tổng số bài gửi : 55
Join date : 01/03/2010
Age : 41
Đến từ : Weapon Institute

Hướng dẫn thao tác Số nguyên lớn! Empty
Bài gửiTiêu đề: Hướng dẫn thao tác Số nguyên lớn!   Hướng dẫn thao tác Số nguyên lớn! I_icon_minitimeThu 23 Jun 2011, 21:50

Dẫn nhập:

Như chúng ta biết, số nguyên bình thường sẽ chiếm 2 byte bộ nhớ (kiểu int); lớn hơn nữa là kiểu long chiếm 4 byte, và cao hơn là kiểu long double với kích thước 10 byte, với việc thao tác trên các kiểu dữ liệu thông thường này thì việc thực hiện hoàn toàn dễ dàng (miễn sao giá trị trả về cũng nằm trong kích thước dữ liệu quy định, nếu không sẽ hiển thị không đúng); song song với các nhiệm vụ thông thường trên thì ngày nay chúng ta bắt gặp những vấn đề phải mở rộng các số nguyên mà chúng ta gọi là Số nguyên lớn! Máy tính sẽ chẳng hiểu số nguyên lớn là gì cả; hơn thế số nguyên lớn cũng chỉ mang tính “định tính” và mơ hồ cho những người còn mập mờ giữa các kiểu số nguyên thông thường! Vậy số nguyên lớn là gì? Số nguyên lớn theo ý chủ quan của tôi là Số nguyên toán học với kích thước lớn hơn kích thước Max lưu trữ thông thường của máy tính; như vậy với ngôn ngữ C thì Số nguyên lớn có kích thước lớn hơn 10 byte! (Tôi hiểu vậy; có anh em nào có ý kiến khác thì chúng ta mở rộng bàn thêm). Vấn đề lưu trữ số nguyên lớn trong máy thông thường sẽ được chúng ta quy về dạng dữ liệu string (mảng 1chiều). Tham gia Congdongcviet.com tôi đã nhận được khá nhiều các Members hỏi về vấn đề này (trên diễn đàn cũng hỏi, và qua hộp thư riêng cũng hỏi), trước yêu cầu đó tôi xin mạnh dạn nêu lên chủ đề này (như lời hứa) để hướng dẫn các Members trên diễn đàn, đồng thời cũng là đề tài mở cho anh em thảo luận bàn thêm (xây dựng tính hoàn chỉnh chủ đề); còn với bản thân cũng đưa ra một tư tưởng sau khi nghiên cứu vấn đề này từ các vị tiền bối đi trước (cũng đã có rất nhiều công trình đã được công bố); vậy mong anh em ủng hộ chủ đề. Peter chân thành cảm ơn!

Bố cục của chủ đề: Chủ đề sẽ hướng dẫn các bạn qua 4 phần:
- Phần 1: Thao tác toán Cộng
- Phần 2: Thao tác toán Trừ
- Phần 3: Thao tác toán Nhân
- Phần 4: Thao tác toán Chia

Trong các phần lớn sẽ có phần phân tích thuật toán và phần viết code tham khảo (có thể đính kèm theo bài viết, đã được test bằng VC++6.0; Peter không dùng Borland C/C++ hoặc TC/TC++). Phần code sẽ được trình bày bằng code C++ (tiện cho các bạn mới đầu học C++).
Về Đầu Trang Go down
http://congdongcviet.com/
peterdrew
Vip
Vip
peterdrew


Tổng số bài gửi : 55
Join date : 01/03/2010
Age : 41
Đến từ : Weapon Institute

Hướng dẫn thao tác Số nguyên lớn! Empty
Bài gửiTiêu đề: Re: Hướng dẫn thao tác Số nguyên lớn!   Hướng dẫn thao tác Số nguyên lớn! I_icon_minitimeThu 23 Jun 2011, 21:53

Phần 1: Thao tác toán Cộng

1. Thuật toán

Giả sử chúng ta có một số nguyên (lớn) a=32145; sẽ có rất nhiều cách lưu trữ số nguyên này (do ta quy định), ở đây Peter sẽ đưa ra cách lưu số này qua mảng 1 chiều ngược, cụ thể như sau: a[0]=5, a[1]=4, a[2]=1, a[3]=2 và a[4]=3; nhưng khi xuất thì lại xuất ngược lại so với cách lưu trữ!, số nguyên này có 5 chữ số, khi nhập (input) số này vào chương trình thì chúng ta sẽ dùng dấu khoảng trắng (space) để ngăn cách các chữ số và nhập bình thường theo thứ tự thông thường, ví dụ a=32145 sẽ được nhập vào như sau: 3 2 1 4 5.
Vậy nếu cần thực hiện phép toán Cộng hai số a và b sau đó lưu vào mảng c (kết quả) thì Peter đề xuất các bước (c=a+b):
- Bước 1: Loại bỏ các chữ số 0 vô nghĩa ở 2 mảng a và b.
- Bước 2: Thêm chữ số 0 ở đầu mảng có độ dài ngắn hơn để 2 mảng có cùng độ dài (tức là nếu a=1234, b=21 thì chúng ta thấy: mảng b có 2 phần tử; mảng a có 4 phần tử; vậy để hai mảng này có số phần tử bằng nhau thì chúng ta thêm 2 chữ số 0 nữa vào mảng b; lúc này b=0021).
- Bước 3: Dùng một biến nhớ, ký hiệu là nho, để lưu trữ số nhớ sau mỗi bước tính. Được khởi tạo có giá trị là 0. Trong một bước tính thì ở vị trí thứ i, các số được tính như sau:

Code:
c[i] = (a[i]+b[i]+nho)%10;
nho = (a[i]+b[i]+nho)/10.

Và cuối cùng, nếu vẫn còn nhớ thì chúng ta thêm một phần tử nữa vào mảng c mang giá trị bằng nho.
- Bước 4: Xuất kết quả theo thứ tự ngược của mảng c; đây là kết quả của phép tính.

Để làm các bạn hiểu tôi xin trình bày các bước trên với việc cộng hai số nguyên sau (để tiện không phải viết nhiều tôi sẽ thao tác với 2 số nguyên thông thường....). Thực hiện với 2 số: a=349 và b=35; c=a+b:
- Bước 1: Loại bỏ các chữ số 0 vô nghĩa; cả 2 số này đều không cần bước này.
- Bước 2: Thêm số 0 vào trước mảng b; lúc này b=035.
+ Cách lưu trữ của a là: 9 4 3 (tương ứng a[0]=9, a[1]=4 và a[2]=3).
+ Cách lưu trữ của b là: 5 3 0 (tương ứng b[0]=5, b[1]=3 và b[2]=0).
- Bước 3: Khởi tạo nho=0 và tính c và nho sau mỗi bước nhỏ:
+ c[0] = (a[0]+b[0]+nho)%10 = (9+5+0)%10 = 4;
nho = (a[0]+b[0]+nho)/10 = (9+5+0)/10 = 1.
+ c[1] = (a[1]+b[1]+nho)%10 = (4+3+1)%10 = 8;
nho = (a[1]+b[1]+nho)/10 = (4+3+1)/10 = 0.
+ c[2] = (a[2]+b[2]+nho)%10 = (3+0+0)%10 = 3;
nho = (a[2]+b[2]+nho)/10 = (3+0+0)/10 = 0.
Vậy mảng c được lưu trữ là: 4 8 3 0.
- Bước 4: Xuất kết quả, sắp xếp ngược lại ta có c=0384 (chính là 384).


[i]2. Tổ chức chương trình theo giải thuật


Sau khi phân tích và đưa ra giải thuật chúng ta đi vào việc xây dựng chương trình thực hiện; trong chương trình Peter mạnh dạn đưa biến global (các bạn có thể tuỳ mà làm, thế nào cũng được). Với lưu ý như sau:
- Nhập vào số các chữ số của số trước khi nhập lần lượt các chữ số.
- Nhập vào các chữ số ngăn cách nhau bằng dấu khoảng trắng (space) như đã nói phía trên.
Các bạn tự tìm hiểu chương trình này (có gì cứ góp ý bàn bạc!).

Code:
#include <stdio.h>
#include <conio.h>
int m,n,dem,nho=0,s,i,j,a[100],b[100],c[100]; //Gia su so nguyen lon co 100 chu so; tuy y!
void nhap()
{
    printf("Nhap so chu so cua so nguyen a, m= ");
    scanf("%d",&m);
    printf("Nhap lan luot cac chu so cua a (ngan cach nhau bang space):\n");
    for(i=m-1;i>=0;i--)
        scanf("%d",&a[i]);
    printf("\n\nNhap so chu so cua so nguyen b, n= ");
    scanf("%d",&n);
    printf("Nhap lan luot cac chu so cua b (ngan cach nhau bang space):\n");
    for(i=n-1;i>=0;i--)
        scanf("%d",&b[i]);
    //Buoc 1: Loai bo cac chu so 0 vo nghia o mang a va b
    while((a[m-1]==0)&&(m>0))
        m--;
    if(m==0)
        a[m++]=0;
    while((b[n-1]==0)&&(n>0))
        n--;
    if(n==0)
        b[n++]=0;
    //Buoc 2: Them cac chu so 0 vao dau cua mang co so phan tu be hon
    if(m<n)
        for(i=1;i<=n-m;i++)
            a[m-1+i]=0;
    else
        for(i=1;i<=m-n;i++)
            b[n-1+i]=0;
    if(m<n)m=n;
    else
        n=m;
}
void cong(int *a,int *b) //Buoc 3: Tinh c[i] va nho
{
    for(i=0;i<m;i++)
    {
        c[i]=(a[i]+b[i]+nho)%10;
        nho=(a[i]+b[i]+nho)/10;
    }
    if(nho>0)
        c[m++]=nho;
}
int main()
{
    nhap();
    cong(a,b);
    printf("\n\nTong la: \n");   
    for(i=m-1;i>=0;i--)    //Buoc 4: Xuat ket qua
        printf("%d",c[i]);
    getch();
    return 0;
}
Về Đầu Trang Go down
http://congdongcviet.com/
 
Hướng dẫn thao tác Số nguyên lớn!
Về Đầu Trang 
Trang 1 trong tổng số 1 trang
 Similar topics
-
» Một số bài hướng dẫn về Mảng!
» Hướng dẫn tạo Dll và dùng Dll trong VB!

Permissions in this forum:Bạn không có quyền trả lời bài viết
Diễn Đàn Khoa học Máy tính - ĐH Công nghệ thông tin (ĐHQG TP HCM) :: LẬP TRÌNH C :: Thủ Thuật Lập Trình-
Chuyển đến