LẬP TRÌNH PHÂN tán - Pdf 12

LẬP TRÌNH PHÂN TÁN NHÓM 1
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP TP.HỒ CHÍ MINH
KHOA CÔNG NGHỆ THÔNG TIN
GVHD: Huỳnh Thái Học
SVTH: Nhóm 1
1. Nguyễn Trung Hiếu 09070301
2. Trịnh Quang Huy 09072881
3. Huỳnh Văn Hiền 09071611
4. Trịnh Trường Thọ 09073251
TÍNH BIỂU THỨC SỐ LỚN 1
LẬP
TRÌNH
PHÂN
TÍNH BIỂU THỨC SỐ LỚN
Tp.HCM,
ngày 6
LẬP TRÌNH PHÂN TÁN NHÓM 1
MỤC LỤC
TÍNH BIỂU THỨC SỐ LỚN 2
LẬP TRÌNH PHÂN TÁN NHÓM 1
LỜI NÓI ĐẦU
Trong thời đại hiện nay với sự phát triển ngày càng lớn mạnh của công nghệ thông tin thì nhu
cầu xử lí dữ liệu với những con số cực lớn (từ 10000 chữ số trở lên) đang rất cần thiết, đặc biệt
trong các ngành khoa học như Toán học như tìm các số nguyên tố lớn, tìm giai thừa của một số
cực lớn, v.v nhưng việc tính toán các giá trị ấy hiện nay vẫn chưa được hỗ trợ, trong đó kiểu
Integer chỉ cho phép tính toán đến 2
32
(khoảng 9 chữ số) và kiểu Long cho phép tính toán đến
2
64
số (khoảng 18 chữ số). Vì vậy chúng ta cần phải tạo ra một chương trình có thể thỏa mãn

trên, sau khi phân tích ra ta sẽ được 2 mảng sau:
{451, 793, 128, 7}
{968, 674, 495}
Ta sẽ lần lượt cộng theo thứ tự từ vị trí 0 đến n với n là chiều dài của mảng dài nhất, nếu có
dư ta sẽ dùng một biến để lưu số dư này lại rồi cộng dồn cho các giá trị sau.
Ta sẽ được một mảng kết quả là:
{419, 468, 624, 7}
Việc còn lại là ta chỉ cần ghép các số này theo chiều ngược lại ta sẽ có kết quả cần tìm là:
7624468419.
1.1.2 Phép toán trừ:
Tương tự như phép toán cộng ta đã phân tích ở trên ta có phép toán trừ của 2 số lớn được
thực hiện như các bước sau:
TÍNH BIỂU THỨC SỐ LỚN 4
LẬP TRÌNH PHÂN TÁN NHÓM 1
Ví dụ ta muốn trừ 2 số: 7128793451 và 495674968.
Trước tiên ta vẫn phân tích 2 số này thành các mảng số nguyên như trên:
{451, 793, 128, 7}
{968, 674, 495}
Ta sẽ lần lượt trừ theo thứ tự từ 0 đến n với n là chiều dài của mảng dài nhất trong 2 mảng
trên, nếu số trên nhỏ hơn số ở dưới chúng ta sẽ cộng cho số ở trên cho 1000 và trừ như bình
thường như cần phải có một biến để lưu giá trị ta “mượn” này.
Sau khi trừ ta sẽ được một mảng kết quả như sau:
{483, 118, 633, 6}
Cũng tương tự như phép cộng, ta chỉ đơn giản ghép các số này lại theo thứ tự từ sau ra
trước để có một kết quả hoàn chỉnh: 6633118483.
Chú ý: Nếu số hạng thứ nhất nhỏ hơn số hạng thứ 2 thì ta sẽ lấy số thứ 2 trừ cho số thứ nhất
và trong kết quả ta sẽ gán thêm một dấu trừ phía trước kết quả.
1.1.3 Phép nhân.
Thông thường để thực hiện một phép nhân phức tạp chúng ta sẽ cộng lần lượt các số lại với
nhau để cho ra kết quả cuối cùng, tuy nhiên phương pháp này sẽ mất rất nhiều thời gian và

hàm sau đây:
 Hàm int[] convertToArray(String a): Dùng để chuyển một kiểu chuỗi sang một kiểu
mảng integer.
 Hàm String Plus(String a, String b): Dùng để cộng 2 số kiểu chuỗi và trả về kết quả
kiểu chuỗi.
 Hàm String Subtract(String a, String b): Dùng để trừ 2 số kiểu chuỗi và trả về kết quả
kiểu chuỗi.
 Hàm String Multi(String a, String b): Dùng để nhân 2 số kiểu chuỗi và trả về kết quả
kiểu chuỗi.
 Hàm String modify(int[] A): Dùng để ghép các số trong mảng kết quả lại thành kiểu
chuỗi.
1.2 PHÂN TÍCH BÀI TOÁN ĐA THỨC THEO HƯỚNG PHÂN TÁN.
Để giải một bài toán đa thức theo hướng phân tán trước hết chúng ta cần phải chia bài toán
lớn ra thành các bài toán con và đưa các bài toán con này cho các máy khác xử lí.
Ví dụ ta có bài toán nhỏ sau: 3*4+5*(7+8).
Ta thấy trong bước đầu tiền khi phân tích đa thức này sẽ tồn tại 2 bài toán con cần xử lí đầu
tiên là 3 * 4 và 7 + 8. Ta sẽ đưa 2 bài toán con này cho các máy con khác xử lí vào được kết
quả là tạo thành một đa thức mới: 12 + 5 * 15. Từ đây lại sinh ra thêm một bài toán con nữa
chính là 5 * 15. Ta lại có một đa thức mới là 12 + 75. Tương tự cho đến khi đa thức này không
còn phép tính nào cả thì ta sẽ được kết quả cuối cùng là 87.
Để có thể phân tích một đa thức ra thành các đơn thức con như trình bày ở trên ta cần phải
sử dụng thuật toán Kí pháp Ba Lan để xử lí nó.
Khi sử dụng thuật toán kí pháp Ba Lan cho một đa thức ta sẽ phân tích đa thức đó thành một
mảng các chuỗi được sắp xếp theo độ ưu tiên của phép toán, ví dụ như chuỗi ở trên sẽ cho ra
kết quả: 3 4 * 5 7 8 + *
Các phép toán nào gần 2 số liên tiếp sẽ được xử lí trước và cho ra kết quả mới. Tương tự
cho đến khi kết quả cuối cùng chỉ còn lại một số.
TÍNH BIỂU THỨC SỐ LỚN 6
LẬP TRÌNH PHÂN TÁN NHÓM 1
2 THỰC THI

boolean ketQuaAm = false;
if (a.charAt(0) == '-' && b.charAt(0) == '-') {
a = a.substring(1);
b = b.substring(1);
ketQuaAm = true;
}
if (a.charAt(0) == '-')
return Subtract(b, a);
if (b.charAt(0) == '-')
return Subtract(a, b);
while (a.length() < b.length())
a = "0" + a;
while (a.length() > b.length())
b = "0" + b;
while (a.length() % 3 != 0)
a = "0" + a;
while (b.length() % 3 != 0)
b = "0" + b;
int[] A = convertToArray(a);
int[] B = convertToArray(b);
int du = 0;
int count = A.length;
int[] plus = new int[count + 1];
for (int i = 0; i < count; i++) {
TÍNH BIỂU THỨC SỐ LỚN 8
LẬP TRÌNH PHÂN TÁN NHÓM 1
du += A[i] + B[i];
plus[i] = du % 1000;
du /= 1000;
}

int count = A.length;
int[] subtract = new int[count];
for (int i = 0; i < count; i++) {
A[i] -= du;
if (A[i] < B[i]) {
A[i] += 1000;
du = 1;
}
else
du = 0;
subtract[i] = A[i] - B[i];
}
String answer = BigNum.modify(subtract);
if (smaller)
answer = "-" + answer;
return answer;
}
//Ham xu li phep toan nhan
public String Multi(String a, String b) throws RemoteException
TÍNH BIỂU THỨC SỐ LỚN 10
LẬP TRÌNH PHÂN TÁN NHÓM 1
{
boolean aAm = false;
boolean bAm = false;
if (a.charAt(0) == '-') {
a = a.substring(1);
aAm = true;
}
if (b.charAt(0) == '-') {
b = b.substring(1);

return answer;
}
}
class BigNum {
//Ham de chuyen mot chuoi thanh mang integer
public static int[] convertToArray(String a) {
int count = a.length() / 3;
int[] answer = new int[count];
int len = a.length() - 1;
int cur = 0;
while (len >= 0) {
int val = (a.charAt(len - 2) - '0') * 100 + (a.charAt(len
- 1) - '0') * 10 + (a.charAt(len) - '0');
answer[cur] = val;
cur++;
len -= 3;
TÍNH BIỂU THỨC SỐ LỚN 12
LẬP TRÌNH PHÂN TÁN NHÓM 1
}
return answer;
}
//Ham de chuyen mot mang integer sang chuoi
public static String modify(int[] A) {
String answer = "";
int count = A.length;
for (int i = count - 1; i >= 0; i ) {
String temp = Integer.toString(A[i]);
while (temp.length() < 3)
temp = "0" + temp;
answer += temp;

}
}
}
2.4 CLASS CLIENT.
public class Client extends javax.swing.JFrame {
/**
* Creates new form Client
*/
public Client() {
initComponents();
}
/**
TÍNH BIỂU THỨC SỐ LỚN 14
LẬP TRÌNH PHÂN TÁN NHÓM 1
* This method is called from within the constructor to initialize
the form.
* WARNING: Do NOT modify this code. The content of this method is
always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated
Code">//GEN-BEGIN:initComponents
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
btnCal = new javax.swing.JButton();
txtInput = new javax.swing.JTextField();
txtOutput = new javax.swing.JTextField();


layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment
.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(36, 36, 36)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment
.LEADING)
TÍNH BIỂU THỨC SỐ LỚN 16
LẬP TRÌNH PHÂN TÁN NHÓM 1
.addComponent(jLabel1)
.addComponent(jLabel2))
.addGap(18, 18, 18)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment
.LEADING, false)
.addComponent(txtInput)
.addComponent(txtOutput,
javax.swing.GroupLayout.DEFAULT_SIZE, 451, Short.MAX_VALUE)))
.addGroup(layout.createSequentialGroup()
.addGap(244, 244, 244)
.addComponent(btnCal)))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE))
);
layout.setVerticalGroup(

.addComponent(btnCal)
.addGap(27, 27, 27))))
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void txtInputFocusGained(java.awt.event.FocusEvent evt)
{//GEN-FIRST:event_txtInputFocusGained
// TODO add your handling code here:
txtInput.setText(null);
txtOutput.setText(null);
}//GEN-LAST:event_txtInputFocusGained
//Xu li chinh
private void btnCalActionPerformed(java.awt.event.ActionEvent evt)
{//GEN-FIRST:event_btnCalActionPerformed
// TODO add your handling code here:
char[] exp = txtInput.getText().toCharArray();
int count = exp.length;
String[] balanExpr = new String[10000];
TÍNH BIỂU THỨC SỐ LỚN 18
LẬP TRÌNH PHÂN TÁN NHÓM 1
char[] S = new char[10000];
int headBalan = 0;
int headS = 0;
String curNum = "";
/*Bat dau thuat toan Balan*/
for (char c : exp) {
if (Character.isDigit(c))
curNum += c;
else {
if (curNum.length() > 0)

if (curNum.length() > 0)
balanExpr[headBalan++] = curNum;
while (headS - 1 >= 0) {
balanExpr[headBalan++] = Character.toString(S[headS -
1]);
headS ;
}
/*Ket thuc thuat toan Ba lan*/
/*Xu ly tinh bieu thuc*/
while (headBalan != 1) {
String[] tempBalan = new String[headBalan];
int headTemp = 0;
String[] A = new String[headBalan];
String[] B = new String[headBalan];
String[] phepToan = new String[headBalan];
int[] vitri = new int[headBalan];
int curCount = 0;
String allPhepToan = "*-+";
TÍNH BIỂU THỨC SỐ LỚN 20
LẬP TRÌNH PHÂN TÁN NHÓM 1
balanExpr[headBalan++] = "x";
balanExpr[headBalan++] = "x";
for (int i = 2; i < headBalan; i++) {
if (allPhepToan.contains(balanExpr[i]) && !
allPhepToan.contains(balanExpr[i - 1]) && !
allPhepToan.contains(balanExpr[i - 2])) {
A[curCount] = balanExpr[i - 2];
B[curCount] = balanExpr[i - 1];
phepToan[curCount] = balanExpr[i];
vitri[curCount] = headTemp;

String num1;
num1=abc.Subtract(A[i],B[i]);
tempBalan[curVitri] = num1;
//System.out.println (A[i]+"-"+B[i]+"="
+num1); }
if (phepToan[i].equals("*"))
{
InterfaceCaculator
abc=(InterfaceCaculator)Naming.lookup("rmi://localhost/cal");
String num2;
num2=abc.Multi(A[i],B[i]);
tempBalan[curVitri] = num2;
// System.out.println (A[i]+"*"+B[i]+"="
+num2);
}
TÍNH BIỂU THỨC SỐ LỚN 22
LẬP TRÌNH PHÂN TÁN NHÓM 1
}
}
catch(Exception e)
{
}
balanExpr = tempBalan;
headBalan = headTemp;
}
txtOutput.setText(balanExpr[0]);
}//GEN-LAST:event_btnCalActionPerformed

il.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {

java.util.logging.Logger.getLogger(Client.class.getName()).log(java.ut
il.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {

java.util.logging.Logger.getLogger(Client.class.getName()).log(java.ut
il.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Client().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnCal;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
TÍNH BIỂU THỨC SỐ LỚN 24
LẬP TRÌNH PHÂN TÁN NHÓM 1
private javax.swing.JTextField txtInput;
private javax.swing.JTextField txtOutput;
// End of variables declaration//GEN-END:variables
}
2.5 THỰC THI CHƯƠNG TRÌNH.
Bước 1: Khởi động Server.


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status