This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
台北總公司/台北縣汐止市新台五路一段 112 號 10 樓 A 棟 Building A, 10F, 112, Shin-Tai-Wu Road Sec. 1, Shijr, Taipei, Taiwan.電話/ 02-26962869 傳真/ 02-26962867台中辦事處/台中市文心路一段 540 號 4 樓 -1 4-1F, 540, Wen Shing Road, Sec. 1, Taichung, Taiwan.電話/ 04-23287870 傳真/ 04-23108168
1-1 漸進式 - 排列組合 開始練習演算法的邏輯推演… 例題 1 求解 求由 n 個之中選出 r 個數字排列組合的數值
rnC
1-1 漸進式 - 排列組合 變成 Java 程式 class Rei01Panel extends Panel { long combi(int n,int r) { int i; long p=1; for (i=1;i<=r;i++) p=p*(n-i+1)/i; return p; } public void paint(Graphics g) { int n,r; for (n=0;n<=5;n++){ for (r=0;r<=n;r++) g.drawString(""+n+"C"+r+"="+combi(n,r),r*60,n*20+20); } } } …
1-2 映射 class Rei02Panel extends Panel { public void paint(Graphics g) { final int Num=20; int[] a={35,25,56,78,43,66,71,73,80,90, 0,73,35,65,100,78,80,85,35,50}; int[] histo=new int[11]; int i,rank;
for (i=0;i<=10;i++) histo[i]=0; for (i=0;i<Num;i++) { rank=a[i]/10; // 映射 if (0<=rank && rank<=10) histo[rank]++; } for (i=0;i<=10;i++) { g.drawString(""+i*10+" - :",10,i*20+20); g.drawString(""+histo[i],50,i*20+20); } } }
1-3 排名 例題 3 單純的方法
假設有成績測驗分數的資料,現欲求其排名順序 假設有下列的得分資料:
juni
1 +1
56 25 67 88 100 55 67 76 56
j
+1 +1 +1 +1
61
i
1-3 排名 class Rei03Panel extends Panel { public void paint(Graphics g) { final int Num=10; int[] a={56,25,67,88,100,61,55,67,76,56}; int[] juni=new int[Num]; int i,j;
for (i=0;i<Num;i++) { juni[i]=1; for (j=0;j<Num;j++) { if (a[j]>a[i]) juni[i]++; } }
1-4 亂數排列 public void paint(Graphics g) { final int N=20; int[] a=new int[N+1]; int i,j,flag;
a[1]=irnd(N); for (i=2;i<=N;i++) { do { a[i]=irnd(N); flag=0; for (j=1;j<i;j++) if (a[i]==a[j]) { flag=1;break; } } while (flag==1); } String s=""; for (i=1;i<=N;i++) s=s+a[i]+","; g.drawString(s,10,20); }
1-4 亂數排列—改良
1 2
交換
1 2 3 N
Na[ ] 2 31 N-1
N-1
1 2 j N
交換
確定
1 2 j N-1
交換
確定
1-4 亂數排列—改良 public void paint(Graphics g) { final int N=20; int[] a=new int[N+1]; int i,j,d;
for (i=1;i<=N;i++) a[i]=i;
for (i=N;i>1;i--) { j=irnd(i-1); d=a[i];a[i]=a[j];a[j]=d; }
String s=""; for (i=1;i<=N;i++) s=s+a[i]+","; g.drawString(s,10,20); }
1-5 蒙地卡羅法 例題 5 求 π
以蒙地卡羅法求 π 的值
X
X
X
X
X
X
X
X X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
XX
X
X
XX
X
X
1
1
Y
X
半徑1的1/4的面積=4
14
1 2
=正方型的面積 111
將亂數產生的x, y值予以描繪出來的圖形
1-5 蒙地卡羅法 …. add(p=new Panel(),"Center"); add(tf=new TextField("",10),"North"); add(bt=new Button(" 圓周率的計算 "),"South"); bt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Graphics g=p.getGraphics(); final int N=50000; double x,y,pai; int i,sum=0,px,py; g.clearRect(50,10,100,100); g.drawRect(50,10,100,100); for (i=1;i<N;i++) { x=Math.random(); y=Math.random(); if (x*x+y*y<1) { px=50+(int)(100*x);py=110-(int)(100*y); g.drawLine(px,py,px,py); sum++; } } pai=(double)4*sum/N; tf.setText(" 圓周率 ="+pai); g.dispose(); …
在判斷 n 是否為質數時,將 n 除 n 以以下的整數直至 2 為止,以觀察能否除盡,這時如有被除盡的數,便被視為質數而脫離出迴圈。到了最後如無除盡的數,則此數即為質數。此外,即使以 n/2 以上的整數除以 n , n 也沒有被除盡的道理,因此程式開始時的值並不是從 n 開始,從 n/2 開始也沒關係,這點從直覺上即可判斷出來。
在數學計算上也可從 開始。
1-7 厄拉多塞篩的求質數法 public void actionPerformed(ActionEvent e) { int i,n,Limit; n=Integer.parseInt(tf.getText()); if (n>=2) { Limit=(int)Math.sqrt(n); for (i=Limit;i>1;i--) { if (n%i ==0) break; } if (i==1) ta.setText(ta.getText()+n+" 是質數 \n"); else ta.setText(ta.getText()+n+" 不是質數 \n"); } }
1-7 厄拉多塞篩的求質數法 厄拉多塞篩演算法解說如下:
1. 將 2 ~ n 的所有數存放至「篩子」。2. 將「篩子」中最小的數設為質數。3. 從「篩子」中取出質數的所有倍數4. 在達到 n 之前,反覆進行 (2) ~ (3) ,留在「篩子」(沒有劃斜線的部分)數即為質數。