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

Niên luận Xây dựng cấu trúc dữ liệu 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 (791.49 KB, 28 trang )

TRƯỜNG ĐẠI HỌC TÂY ĐÔ
KHOA KỸ THUẬT CÔNG NGHỆ
NIÊN LUẬN 1
XÂY DỰNG CẤU TRÚC DỮ LIỆU SỐ NGUYÊN LỚN (BIG-
INTEGER)
Đà Nẵng: 12/2007Đà Nẵng: 12/2007Đà Nẵng: 12/2007Đà Nẵng: 12/2007Đà Nẵng: 12/2007
Cần Thơ, 7/ 2015
Cần Thơ, 7/ 2015
GIẢNG VIÊN HƯỚNG DẪN:
VƯƠNG HUỲNH LONG
SINH VIÊN THỰC HIỆN:
Trần Gia Bảo
MSSV: 13D480201019
LỚP: ĐẠI HỌC TIN HỌC 8
Nhận xét của giảng viên hướng dẫn




















Cần Thơ, ngày tháng năm
Giảng viên chấm
ĐỀ TÀI: Xây dựng cấu trúc dữ liệu số nguyên lớn (Big-integer)
GIẢNG VIÊN HƯỚNG DẪN: GV. VƯƠNG HUỲNH LONG
SINH VIÊN THỰC HIỆN: LÂM THÀNH ĐẠT
STT HỌ VÀ TÊN MSSV THƯỞNG ĐIỂM
1 Trần Gia Bảo 13D480201019
I.HÌNH THỨC (Tối đa 1.0 điểm) Nhận Xét Điểm
Bìa (0.5 điểm)
• Tiêu đề: Trường ĐHTĐ, Khoa KTCN, Logo, Loại đồ
án
Tên đề tài, GVHD, SVTH, Nơi và năm thực hiện
• Font chữ chính, Size chính, Khoảng cách dòng
Bố cục (0.5 điểm)
• Trang bìa phụ, Trang nhận xét của giáo viên, Bảng
đánh giá điểm, Mục lục 3 cấp, Tài liệu tham khảo
II. NỘI DUNG (Tối đa 4.5 điểm)
Giới thiệu (0.5 điểm)
• Đặt vấn đề
• Mục tiêu cần đạt
• Phương pháp thực hiện
Lý thuyết (1 điểm)
• Giới thiệu: môi trường lập trình, ngôn ngữ lập trình,

• Giới thiệu cú pháp các lệnh tiêu biểu.
Ứng dụng (2.5 điểm)
• Các giải thuật và lưu đồ (Tối đa 1.0 điểm)

• Giới thiệu chương trình (Tối đa 1.5 điểm)
 Môi trường lập trình
 Môi trường cài đặt
 Các tính năng chính
Kết luận (0.5 điểm)
• Kết quả đạt được
• Hạn chế
• Hướng phát triển
III. DEMO (Tối đa 3.5 điểm)
Giao diện (1 điểm)
• Có hệ thống các sự lựa chọn
• Cách trình bày kết quả
Thao tác (2.5 điểm)
• Có kiểm tra tính hợp lệ của dữ liệu đầu vào
• Kết quả hợp với dữ liệu đầu vào
• Có báo lỗi trong một số trường hợp
IV. THƯỞNG (Tối đa 1.0 điểm)
Cần thơ, ngày tháng năm 2015
GIẢNG VIÊN CHẤM
VƯƠNG HUỲNH LONG
LỜI CẢM ƠN
Đầu tiên tôi xin gửi lời cám ơn chân thành nhất đến Thầy Vương Huỳnh
Long người đã trực tiếp hướng dẫn, tận tình giải đáp những thắc mắc, giúp đỡ
tôi trong việc hình thành, phát triển và hoàn thành niên luận này.
Tôi cũng xin chân thành cảm ơn quý Thầy, Cô trường Đại học Tây Đô,
những người đã người đã trực tiếp giảng dạy, truyền đạt những kiến thức bổ ích
cho tôi, đó chính là những nền tảng cơ bản và là những hành trang kiến thức vô
cúng quý giá. Nhờ đó, tôi mới có thể hoàn thành tốt được bài niên luận này.
Trong quá trình làm niên luận không tránh khỏi những sai sót. Kính mong
nhận được sự góp ý và nhận xét từ quý Thầy, Cô cũng như các bạn để kiến thức

của tôi ngày càng hoàn thiện hơn.
Xin chân thành cảm ơn!
Sinh viên thực hiện
Trần Gia Bảo
MỤC LỤC
CHƯƠNG I : GIỚI THIỆU 5
1. Sơ lược về ngôn ngữ C# và BIG-INTEGER 5
1. 1. Ngôn Ngữ C# 5
CHƯƠNG II : ỨNG DỤNG 7
2. Ứng dụng chương trình 7
2.1. Ý tưởng 7
2.2. Một số cú pháp của chương trình, chương trình con 8
2.3. Chương trình tính toán số nguyên cực lớn (BIG-INTEGER) 19
CHƯƠNG III : KẾT LUẬN 27
3. Kết luận 27
3.1. Kết quả đạt được 27
3.2. Hạn chế 27
3.3. Hướng phát triển 27
TÀI LIỆU THAM KHẢO 28
CHƯƠNG I : GIỚI THIỆU
1. Sơ lược về ngôn ngữ C# và BIG-INTEGER
1. 1. Ngôn Ngữ C#
C# là một ngôn ngữ rất đơn giản, với khoảng 80 từ khoá, hơn mười kiểu dữ liệu
dựng sẵn, nhưng C# có tính diễn đạt cao. C# hỗ trợ lập trình có cấu trúc, hướng đối
tượng, hướng thành phần.
Trọng tâm của ngôn ngữ hướng đối tượng là lớp. Lớp định nghĩa kiểu dữ liệu
mới, cho phép mở rộng ngôn ngữ theo hướng cần giải quyết. C# có những từ khoá dành
việc khai báo lớp, phương thức, thuộc tính mới. C# hỗ trợ đầy đủ khái niệm trụ cột
trong lập trình hướng đối tượng: đóng gói, thừa kế, đa hình.
Định nghĩa lớp trong C# không đòi hỏi tách rời tập tin tiêu đề với tập tin cài đặt

như C++. Hơn thế, C# hỗ trợ kiểu sưu liệu mới, cho phép sưu liệu trực tiếp trong tập tin
mã nguồn. Đến khi biên dịch sẽ tạo tập tin sưu liệu theo định dạng XML.
C# được hỗ trợ khái niệm giao diện, interfaces. Một lớp chỉ có thể kế thừa duy
nhất một lớp cha nhưng có thể cài đặt nhiều giao diện.
C# có kiểu cấu trúc, struct không giống C++. Cấu trúc là kiểu hạng nhẹ và bị giới
hạn. Cấu trúc không thể thừa kế lớp hay được kế thừa nhưng có thê cài đặt giao diện.
C# cung cấp những đặc trưng lập trình hướng thành phần như property, sự kiện
và dẫn hướng khai báo. Lập trình hướng component được hỗ trợ bởi CLR thông qua siêu
dữ liệu metadata. Siêu dữ liệu mô tả các lớp bao gồm các phương thức và thuộc tính,
thông tin bảo mật…
Assembly là một tập hợp các tập tin mà theo cách nhìn của lập trình viên là các
thư viện liên kết động DLL hay tập tin EXE. Trong .NET một assembly là một đơn vị
của việc tái sử dụng, xác định phiên bản, bảo mật và phân phối. CLR cung cấp một số
các lớp để thao tác với assembly.
C# cũng cho truy cập trực tiếp dùng con trỏ kiểu C++, nhưng vùng mã đó được
xem như không an toàn. CLR sẽ không thực thi việc thu dọn rác tự động các đối tượng
được tham chiếu bởi con trỏ cho đến khi lập trình viên tự giải phóng.
1.2. Môi trường lập trình Microsoft Visual Studio:
Microsoft Visual Studio là một môi trường phát triển tích hợp (IDE) từ Microsoft.
Nó được sử dụng để phát triển chương trình máy tính cho Microsoft Windows, cũng như
các trang web, các ứng dụng web và các dịch vụ web. Visual Studio sử dụng nền tảng
phát triển phần mềm của Microsoft như Windows API, Windows Forms, Windows
Presentation Foundation, Windows Store và Microsoft Silverlight. Nó có thể sản xuất cả
hai ngôn ngữ máy và mã số quản lý.
Visual Studio bao gồm một trình soạn thảo mã hỗ trợ IntelliSense cũng như cải tiến
mã nguồn. Trình gỡ lỗi tích hợp hoạt động cả về trình gỡ lỗi mức độ mã nguồn và gỡ lỗi
mức độ máy. Công cụ tích hợp khác bao gồm một mẫu thiết kế các hình thức xây dựng
giao diện ứng dụng, thiết kế web, thiết kế lớp và thiết kế giản đồ cơ sở dữ liệu. Nó chấp
nhận các plug-in nâng cao các chức năng ở hầu hết các cấp bao gồm thêm hỗ trợ cho các
hệ thống quản lý phiên bản (như Subversion) và bổ sung thêm bộ công cụ mới như biên

tập và thiết kế trực quan cho các miền ngôn ngữ cụ thể hoặc bộ công cụ dành cho các
khía cạnh khác trong quy trình phát triển phần mềm.
Visual Studio hỗ trợ nhiều ngôn ngữ lập trình khác nhau và cho phép trình biên tập
mã và gỡ lỗi để hỗ trợ (mức độ khác nhau) hầu như mọi ngôn ngữ lập trình. Các ngôn
ngữ tích hợp gồm có C,[1] C++ và C++/CLI (thông qua Visual C++), VB.NET (thông
qua Visual Basic.NET), C thăng (thông qua Visual C#) và F thăng (như của Visual
Studio 2010). Hỗ trợ cho các ngôn ngữ khác như J++/J thăng, Python và Ruby thông qua
dịch vụ cài đặt riêng rẽ. Nó cũng hỗ trợ XML/XSLT, HTML/XHTML, JavaScript và
CSS. Microsoft cung cấp phiên bản "Express" là phiên bản miễn phí của Visual Studio.
1.3. Khái niệm số nguyên lớn Big-Integer
Big-Integer là một cấu trúc cho một số nguyên cực lớn, thường thấy trong các ngôn
ngữ lập trình hiện nay.
Chúng ta sử dụng nó khi muốn đại diện cho số nguyên lớn hơn giới hạn cho phép có.
Một ví dụ về đại diện cho số nguyên lớn để làm việc với mục đích mã hóa. Trong khi
các thuật toán mật mã thực có thể sử dụng một cái gì đó đặc biệt và hiệu quả hơn, sử
dụng BigInteger để nhân số nguyên lớn với nhau là một cách tốt để hiển thị những gì xảy
ra một cách logic trong mã mật.
CHƯƠNG II : ỨNG DỤNG
2. Ứng dụng chương trình
2.1. Ý tưởng
Trong các ngôn ngữ lập trình, các kiểu số thường bị giới hạn ở một mức nào
đó. Ví dụ như kiểu dữ liệu int của ngôn ngữ C++ thường giới hạn ở mức–2,147,483,648
đến 2,147,483,647. Tuy nhiên có những lúc ta cần phải thao tác với những số vượt quá
giới hạn này. Do đó ta cần phải có những phương pháp khác nhau để giải quyết vấn đề
này. Trước tiên biến dãi số thành dạng chuỗi (String) sau đó thực hiện tính toán và biến
đổi các con số sao cho ra được kết quả đúng nhất.
2.2. Một số cú pháp của chương trình, chương trình con
a) Các hàm :
b) Phép cộng :
Cộng:

aaaaaaaaaaaaaaaaaaaa
bbb
Bước 1: thêm 0 vào bên trái cho dài bằng nhau
aaaaaaaaaaaaaaaaaaaa
000000000000000bbb
Bước 2: Khởi tạo 1 biến nhớ n = 0, xâu r rỗng. Cộng từ phải qua trái, các cặp
chữ số với thêm cả biến nhớ n. Nếu tổng c (a+b+n) lớn hơn 9 thì lấy nó trừ đi 10 thu
được c và gán lại biến nhớ n = 1 (không bao giờ nhớ được lên tận 2 vì 9 + 9 + 1 cũng chỉ
là 19). Nếu tổng c nhỏ hơn 10 thì thu được c và gán biến nhớ n = 0. Lưu giá trị c, nhét
vào sau r. Sau khi cộng đến cặp chữ số bên trái nhất, nếu nhớ còn là 1 thì thêm 1 vào sau
r.
Bước 3: Đảo ngược chuỗi r, ta có tổng.
// Phép cộng
public string add(string strNum1, string strNum2)
{
// Phần xử lý số thập phân
// nếu là số nguyên thì thêm .0
if (strNum1.IndexOf('.') < 0)
strNum1 = strNum1 + ".0";
if (strNum2.IndexOf('.') < 0)
strNum2 = strNum2 + ".0";
//tách mỗi số thành hai phần nguyên và thập phân
string strnum1_p1 = strNum1.Substring(0, strNum1.IndexOf('.'));
string strnum1_p2 = strNum1.Substring(strNum1.IndexOf('.') + 1);
string strnum2_p1 = strNum2.Substring(0, strNum2.IndexOf('.'));
string strnum2_p2 = strNum2.Substring(strNum2.IndexOf('.') + 1);
bool flag = false;
string strNumBigger = "";
if (strNum1.Length >= strNum2.Length)
strNumBigger = strNum1;

else
strNumBigger = strNum2;
if (strnum1_p1.Length == strnum2_p1.Length)
flag = true;
//thêm các số 0 vào trước và sau dấu chấm cho bằng nhau
if (strnum1_p1.Length > strnum2_p1.Length)
strnum2_p1 = strnum2_p1.PadLeft(strnum1_p1.Length, '0');
else if (strnum1_p1.Length < strnum2_p1.Length)
strnum1_p1 = strnum1_p1.PadLeft(strnum2_p1.Length, '0');
if (strnum1_p2.Length > strnum2_p2.Length)
strnum2_p2 = strnum2_p2.PadRight(strnum1_p2.Length, '0');
else if (strnum1_p2.Length < strnum2_p2.Length)
strnum1_p2 = strnum1_p2.PadRight(strnum2_p2.Length, '0');
// lấy về vị trí dấu chấm
int x = strnum1_p1.Length;
//Ghép hai thành phân thành một chuỗi (bỏ dấu chấm) và đưa vào mảng int[]
strNum1 = strnum1_p1 + strnum1_p2;
strNum2 = strnum2_p1 + strnum2_p2;
int[] arrNum1 = new int[strNum1.Length];
int[] arrNum2 = new int[strNum2.Length];
for (int i = 0; i < strNum1.Length; i++)
{
arrNum1[i] = Convert.ToInt32(strNum1.Substring(i, 1));
}
for (int i = 0; i < strNum2.Length; i++)
{
arrNum2[i] = Convert.ToInt32(strNum2.Substring(i, 1));
}
//
//Đảo ngược chuỗi

Array.Reverse(arrNum1);
Array.Reverse(arrNum2);
//số mũ của 10 chính là số phần tử trong mảng int[]
int[] arrResult = new int[strNum1.Length + 1];
int phanbu = 0;
for (int i = 0; i < strNum1.Length; i++)
{
arrResult[i] = arrNum1[i] + arrNum2[i] + phanbu;
if (arrResult[i] >= 10)
{
arrResult[i] -= 10;
phanbu = 1;
}
else
phanbu = 0;
}
if (phanbu == 1)
arrResult[arrResult.Length - 1] = 1;
//Đảo ngược chuỗi Result
Array.Reverse(arrResult);
StringBuilder strbd = new StringBuilder(arrResult.Length);
foreach (int i in arrResult)
strbd.Append(i);
string strResult = "";
if (phanbu == 1)
strResult = strbd.ToString();
else if (phanbu == 0)
strResult = strbd.ToString().Substring(1);
//đưa dấu chấm vào kết quả ở vị trí x
if (flag == true && strNumBigger.Length == strResult.Length)

x += 1;
strResult = strResult.Insert(x, ".");
return strResult;
}
c) Phép trừ:
Khi thực hiện phép trừ, xử lý việc nhớ ngược lại với phép cộng, tập trung vào
việc vay mượn từ hàng cao hơn. Trong hàm trừ, để đơn giản ta chỉ xét trường hợp số lớn
trừ số nhỏ hơn.
private void btnSub_Click(object sender, System.EventArgs e)
{
if (!checkInput())
{
MessageBox.Show("Input Number is not valid");
txtNumber1.Focus();
}
else
{
string strNum1 = txtNumber1.Text;
string strNum2 = txtNumber2.Text;
// phần xử lý số thập phân
//nếu là số nguyên thì thêm .0
if (strNum1.IndexOf('.') < 0)
strNum1 = strNum1 + ".0";
if (strNum2.IndexOf('.') < 0)
strNum2 = strNum2 + ".0";
//tách mỗi số thành 2 phần nguyên và thập phân
string strnum1_p1 = strNum1.Substring(0, strNum1.IndexOf('.'));
string strnum1_p2 = strNum1.Substring(strNum1.IndexOf('.') + 1);
string strnum2_p1 = strNum2.Substring(0, strNum2.IndexOf('.'));
string strnum2_p2 = strNum2.Substring(strNum2.IndexOf('.') + 1);

//thêm số 0 vào phần trước và sau dấu chấm cho đủ
if (strnum1_p1.Length > strnum2_p1.Length)
strnum2_p1 = strnum2_p1.PadLeft(strnum1_p1.Length, '0');
else if (strnum1_p1.Length < strnum2_p1.Length)
strnum1_p1 = strnum1_p1.PadLeft(strnum2_p1.Length, '0');
if (strnum1_p2.Length > strnum2_p2.Length)
strnum2_p2 = strnum2_p2.PadRight(strnum1_p2.Length, '0');
else if (strnum1_p2.Length < strnum2_p2.Length)
strnum1_p2 = strnum1_p2.PadRight(strnum2_p2.Length, '0');
// lấy về vị trí dấu chấm
int x = strnum1_p1.Length;
//ghép 2 phần thành 1 chuỗi (bỏ dấu chấm) à đưa vào mảng int[]
strNum1 = strnum1_p1 + strnum1_p2;
strNum2 = strnum2_p1 + strnum2_p2;
int[] arrNum1 = new int[strNum1.Length];
int[] arrNum2 = new int[strNum2.Length];
for (int i = 0; i < strNum1.Length; i++)
{
arrNum1[i] = Convert.ToInt32(strNum1.Substring(i, 1));
}
for (int i = 0; i < strNum2.Length; i++)
{
arrNum2[i] = Convert.ToInt32(strNum2.Substring(i, 1));
}
//
string strNumBig = "";
string strNumSmall = "";
// Tìm số lớn hơn
for (int i = 0; i < strNum1.Length; i++)
{

if (arrNum1[i] > arrNum2[i])
{
strNumBig = strNum1;
break;
}
else if (arrNum1[i] < arrNum2[i])
{
strNumBig = strNum2;
break;
}
}
if (strNumBig == "")
{
txtResult.Text = "0";
// MessageBox.Show("2 số bằng nhau");
}
else //nếu 2 số không bằng nhau
{
if (strNumBig == strNum1)
strNumSmall = strNum2;
else
strNumSmall = strNum1;
//đưa vào mảng int[]
int[] arrNumBig = new int[strNumBig.Length];
int[] arrNumSmall = new int[strNumSmall.Length];
for (int i = 0; i < strNumBig.Length; i++)
{
arrNumBig[i] = Convert.ToInt32(strNumBig.Substring(i, 1));
}
for (int i = 0; i < strNumSmall.Length; i++)

{
arrNumSmall[i] = Convert.ToInt32(strNumSmall.Substring(i, 1));
}
//
//Đảo ngược chuỗi
Array.Reverse(arrNumBig);
Array.Reverse(arrNumSmall);
//số mũ của 10 chính là chỉ số phần tử trong mảng int[]
int[] arrResult = new int[strNumBig.Length];
int phanbu = 0;
for (int i = 0; i < strNumBig.Length; i++)
{
arrNumSmall[i] = arrNumSmall[i] + phanbu;
if (arrNumBig[i] >= arrNumSmall[i])
{
arrResult[i] = arrNumBig[i] - arrNumSmall[i];
phanbu = 0;
}
else
{
arrResult[i] = arrNumBig[i] + 10 - arrNumSmall[i];
phanbu = 1;
}
}
//Đảo ngược chuỗi Result
Array.Reverse(arrResult);
StringBuilder strbd = new StringBuilder(arrResult.Length);
foreach (int i in arrResult)
strbd.Append(i);
//đưa dấu chấm vào bằng Insert()

strbd.Insert(x, ".");
string strResult = strbd.ToString();
//nếu trước dấu chấm có > 1 số 0 thì chỉ để lại 1 số 0
string str1 = strResult.Substring(0, strResult.IndexOf('.'));
string str2 = strResult.Substring(strResult.IndexOf('.') + 1);
Regex regex = new Regex(@"^0+$");
Match m = regex.Match(str1);
if (m.Success)
strResult = "0." + str2;
else
strResult = str1 + "." + str2;
if (strNumBig == strNum1)
strResult = strResult;
else if (strNumBig == strNum2)
strResult = "-" + strResult;
//
txtResult.Text = strResult;
}
}
}
//Hàm trừ hai số nguyên (số_1 >= số_2)
public string SubInt(string strNumBig, string strNumSmall)
{
string strResult = "";
//thêm số 0 vào đầu chuổi số nhỏ hơn cho đủ
strNumSmall = strNumSmall.PadLeft(strNumBig.Length, '0');
//Đưa vào mảng int[]
int[] arrNumBig = new int[strNumBig.Length];
int[] arrNumSmall = new int[strNumSmall.Length];
for (int i = 0; i < strNumBig.Length; i++)

{
arrNumBig[i] = Convert.ToInt32(strNumBig.Substring(i, 1));
}
for (int i = 0; i < strNumSmall.Length; i++)
{
arrNumSmall[i] = Convert.ToInt32(strNumSmall.Substring(i, 1));
}
d) Phép nhân
private void btnMul_Click(object sender, System.EventArgs e)
{
if (!checkInput())
{
MessageBox.Show("Input Number is not valid");
txtNumber1.Focus();
}
else
{
//chuyển số thập phần thành số nguyên và lấy về vị trí dấu chấm từ phải sang
string[] strTempN1 = myConvert(txtNumber1.Text).Split(new char[] { '~' });
string[] strTempN2 = myConvert(txtNumber2.Text).Split(new char[] { '~' });
int pos = Convert.ToInt32(strTempN1[1]) + Convert.ToInt32(strTempN2[1]);
//Phép nhân hai số nguyên
string strNum1 = strTempN1[0];
string strNum2 = strTempN2[0];
//Đưa vào mảng int[]
int[] arrNum2 = new int[strNum2.Length];
for (int i = 0; i < strNum2.Length; i++)
{
arrNum2[i] = Convert.ToInt32(strNum2.Substring(i, 1));
}

//Mãng String lưu trữ các số hạng
string[] arrstr = new string[strNum2.Length];
int x = 0;
for (int i = strNum2.Length - 1; i >= 0; i )
{
arrstr[x] = Mul(strNum1, arrNum2[i]);
//thêm số 0 ở cuối chuỗi
arrstr[x] = arrstr[x].PadRight(arrstr[x].Length + x, '0');
x++;
}
//cộng các số hạng nguyên bằng hàm addInt() với nhau
string strResult = "";
for (int i = 0; i < arrstr.Length; i++)
{
strResult = addInt(strResult, arrstr[i]);
}
//nếu pos > strResult.Length (vd: 0.34/0.03) thì thêm 0 trước
strResult = strResult.PadLeft(pos + 1, '0');
//đưa dấu chấm vào
strResult = strResult.Insert(strResult.Length - pos, ".");
if (strResult.IndexOf('.') == strResult.Length - 1)
strResult = strResult.Substring(0, strResult.Length - 1);
txtResult.Text = strResult;
}
}
e) Phép chia
Chia 12415 cho 23
1 2 4 1 5 chia 2 3 0 0
0 0
23 có 2 chữ số. Lấy 12 chia cho 23, được 0, dư 12. Hạ 4 xuống

1 2 4 1 5 chia 2 3 0 0
0 0 0
1 2 4 0 0
Tiếp tục tính 124 chia cho 23 tìm thương và phần dư
Bước 1. Gán thương t=0; a=124; b=023
Bước 2. Nếu a nhỏ hơn b thì thương t và dư là a
Bước 3. Gán a=a-b và tăng t lên 1
Quay lại bước 2.
1 2 4 1 5 chia 2 3 0 0
0 5
1 2 4
9 1
Làm tương tự cho đến khi không còn chữ số nào để hạ xuống thì thương là dãy số bên trái (cắt bỏ 0 ở
bên trái), số dư là dãy số bên phải.
1 2 4 1 5 chia 2 3
0 5 3 9
1 2 4
9 1
2 2 5
1 8
//Phép chia btnDiv_Click
private void btnDiv_Click(object sender, System.EventArgs e)
{
if (!checkInput())
{
MessageBox.Show("Input Number is not valid");
txtNumber1.Focus();
}
else
{

string strNum1 = txtNumber1.Text;
string strNum2 = txtNumber2.Text;
// Phần xử lí số thập phần
// nếu là số nguyên thì thêm .0
if (strNum1.IndexOf('.') < 0)
strNum1 = strNum1 + ".0";
if (strNum2.IndexOf('.') < 0)
strNum2 = strNum2 + ".0";
// tách mỗi số thành hai phần nguyên và phần thập phân
string strnum1_p1 = strNum1.Substring(0, strNum1.IndexOf('.'));
string strnum1_p2 = strNum1.Substring(strNum1.IndexOf('.') + 1);
string strnum2_p1 = strNum2.Substring(0, strNum2.IndexOf('.'));
string strnum2_p2 = strNum2.Substring(strNum2.IndexOf('.') + 1);
// thêm số 0 vào sau dấu . cho đủ
if (strnum1_p2.Length > strnum2_p2.Length)
strnum2_p2 = strnum2_p2.PadRight(strnum1_p2.Length, '0');
else if (strnum1_p2.Length < strnum2_p2.Length)
strnum1_p2 = strnum1_p2.PadRight(strnum2_p2.Length, '0');
// Ghép 2 thành phần thành một chuổi (bỏ dấu chấm)
strNum1 = strnum1_p1 + strnum1_p2;
strNum2 = strnum2_p1 + strnum2_p2;
// Bỏ các số 0 nếu có
strNum1 = MyRemove(strNum1);
strNum2 = MyRemove(strNum2);
// MessageBox.Show(strNum1 +"~"+ strNum2);
// Thực hiện phép chia 2 số nguyên
if (strNum1 == strNum2)
{
txtResult.Text = "1";
}

else //Khi 2 số không bằng nhau
{
string strResult = "";
//Nếu số bị chia (strNum1) lớn hơn
if (NumBigger(strNum1, strNum2) == strNum1)
{
string strtemp = strNum1.Substring(0, strNum2.Length);
string strBookmark = strtemp;
string phandu = "";
bool flag = true;
while (phandu != "0" || strtemp != "00")
{
//kết quả cố tối đa 80 chữ số (tính cả dấu chấm)
if (strResult.Length == 80)
break;
string[] arrKetqua = DivInt(strtemp, strNum2).Split(
new char[] { '~' });
strResult += arrKetqua[0];
phandu = arrKetqua[1];
// MessageBox.Show("~"+arrKetqua[0]+"~"+arrKetqua[1]+"~");
if (strBookmark.Length < strNum1.Length) //vẫn còn số để hạ
{
strBookmark = strNum1.Substring(0, strBookmark.Length + 1);
//hạ số xuống để tiếp tục chia
strtemp = phandu + strNum1.Substring(strBookmark.Length - 1, 1);
if (strtemp.IndexOf('0') == 0) //Ex: 0.34/0.03
strtemp = strtemp.Substring(1);
}
else if (strBookmark.Length == strNum1.Length) //hết số để hạ
{

if (flag == true)
{
strResult += ".";
flag = false;
}
//thêm 0 vào phần dư để tiếp tục chia
strtemp = phandu + "0";
//nếu đã thêm 0 mà strtemp vẫn nhỏ hơn số bị chia
if (NumBigger(strtemp, strNum2) == strNum2)
{
// strResult += "0";
strtemp = phandu + "0";
}
}
}
}
//nếu số chia lớn hơn
else if (NumBigger(strNum1, strNum2) == strNum2)
{
strResult = "0.0";
while (NumBigger(strNum1, strNum2) == strNum2)
{
strNum1 += "0";
strResult += "0";
}
bool flag = true;
if (strNum1.Length > strNum2.Length)
{
flag = false;
}

strResult = strResult.Substring(0, strResult.Length - 2);
// thực hiện tương tự phần trên ===============
string strtemp = strNum1.Substring(0, strNum2.Length);
string strBookmark = strtemp;
string phandu = "";
while (phandu != "0")
{
// kết quả có tối đa 40 chữ số (tính cả dấu chấm)
if (strResult.Length == 40)
break;
string[] arrKetqua = DivInt(strtemp, strNum2).Split(
new char[] { '~' });
strResult += arrKetqua[0];
phandu = arrKetqua[1];
if (strBookmark.Length < strNum1.Length) //vẫn còn số để hạ
{
strBookmark = strNum1.Substring(0, strBookmark.Length + 1);
//hạ số xuống để tiếp tục chia
strtemp = phandu + strNum1.Substring(strBookmark.Length - 1, 1);
}
else if (strBookmark.Length == strNum1.Length) //hết số để hạ
{
//thêm 0 vào phần dư để tiếp tục chia
strtemp = phandu + "0";
//nếu đã thêm 0 mà strtemp vẫn nhỏ hơn số bị chia
if (NumBigger(strtemp, strNum2) == strNum2)
{
// strResult += "0";
strtemp = phandu + "0";
}

}
}
if (flag == false)
{
strResult = "0." + strResult.Substring(3);
}
}
//nếu có dấu chấm ở cuối thì bỏ đi
if (strResult.IndexOf('.') == strResult.Length - 1)
strResult = strResult.Substring(0, strResult.Length - 1);
txtResult.Text = strResult;
// txtResult.Text = "~"+strNum1 +"~"+ strNum2 +"~" + strResult;
}
}
}
2.3. Chương trình tính toán số nguyên cực lớn (BIG-INTEGER)
Đây là chương trình mô phỏng máy tính để tính toán các số nguyên cực lớn. Chương
trình có các chức năng cơ bản trong tính toán như cộng, trừ, nhân, chia, lấy lũy thừa, chia
lấy dư.
2.2. Sử dụng chương trình
Nhập vào lần lượt 2 con số bất kì, chọn 1 phép tính trên các phím lệnh. Kết quả sẽ
được trả về ô kết quả phía dưới.
2.2. Hình ảnh demo
a) Phép cộng
b) Phép trừ
c) Phép nhân
d) Phép chia

×