JAVA經(jīng)典算法40題_第1頁
JAVA經(jīng)典算法40題_第2頁
JAVA經(jīng)典算法40題_第3頁
JAVA經(jīng)典算法40題_第4頁
JAVA經(jīng)典算法40題_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、JAVA經(jīng)典算法40題【程序1】 題目:古典問題:有一對兔子,從出生后第3個(gè)月起每個(gè)月都生一對兔子,小兔子長到第四個(gè)月后每個(gè)月又生一對兔子,假如兔子都不死,問每個(gè)月的兔子總數(shù)為多少? 1.程序分析: 兔子的規(guī)律為數(shù)列1,1,2,3,5,8,13,21. public class exp2public static void main(String args)int i=0;for(i=1;i=20;i+)System.out.println(f(i);public static int f(int x)if(x=1 | x=2)return 1;elsereturn f(x-1)+f(x-2)

2、;或public class exp2public static void main(String args)int i=0;math mymath = new math();for(i=1;i=20;i+)System.out.println(mymath.f(i);class mathpublic int f(int x)if(x=1 | x=2)return 1;elsereturn f(x-1)+f(x-2);【程序2】 題目:判斷101-200之間有多少個(gè)素?cái)?shù),并輸出所有素?cái)?shù)。 1.程序分析:判斷素?cái)?shù)的方法:用一個(gè)數(shù)分別去除2到sqrt(這個(gè)數(shù)),如果能被整除, 則表明此數(shù)不是素?cái)?shù),

3、反之是素?cái)?shù)。 public class exp2public static void main(String args)int i=0;math mymath = new math();for(i=2;i=200;i+)if(mymath.iszhishu(i)=true)System.out.println(i);class mathpublic int f(int x)if(x=1 | x=2)return 1;elsereturn f(x-1)+f(x-2);public boolean iszhishu(int x)for(int i=2;i=x/2;i+)if (x % 2=0 )r

4、eturn false;return true;【程序3】 題目:打印出所有的 水仙花數(shù) ,所謂 水仙花數(shù) 是指一個(gè)三位數(shù),其各位數(shù)字立方和等于該數(shù)本身。例如:153是一個(gè) 水仙花數(shù) ,因?yàn)?53=1的三次方5的三次方3的三次方。 1.程序分析:利用for循環(huán)控制100-999個(gè)數(shù),每個(gè)數(shù)分解出個(gè)位,十位,百位。 public class exp2public static void main(String args)int i=0;math mymath = new math();for(i=100;i=999;i+)if(mymath.shuixianhua(i)=true)System.

5、out.println(i);class mathpublic int f(int x)if(x=1 | x=2)return 1;elsereturn f(x-1)+f(x-2);public boolean iszhishu(int x)for(int i=2;i=x/2;i+)if (x % 2=0 )return false;return true;public boolean shuixianhua(int x) int i=0,j=0,k=0; i=x / 100; j=(x % 100) /10; k=x % 10; if(x=i*i*i+j*j*j+k*k*k) return

6、true; else return false; 【程序4】 題目:將一個(gè)正整數(shù)分解質(zhì)因數(shù)。例如:輸入90,打印出90=2*3*3*5。 程序分析:對n進(jìn)行分解質(zhì)因數(shù),應(yīng)先找到一個(gè)最小的質(zhì)數(shù)k,然后按下述步驟完成: (1)如果這個(gè)質(zhì)數(shù)恰等于n,則說明分解質(zhì)因數(shù)的過程已經(jīng)結(jié)束,打印出即可。 (2)如果n k,但n能被k整除,則應(yīng)打印出k的值,并用n除以k的商,作為新的正整數(shù)你,重復(fù)執(zhí)行第一步。 (3)如果n不能被k整除,則用k+1作為k的值,重復(fù)執(zhí)行第一步。 public class exp2public exp2() public void fengjie(int n) for(int i=2

7、;i =90分的同學(xué)用A表示,60-89分之間的用B表示,60分以下的用C表示。 1.程序分析:(a b)?a:b這是條件運(yùn)算符的基本例子。 import javax.swing.*;public class ex5 public static void main(String args) String str=; str=JOptionPane.showInputDialog(請輸入N的值(輸入exit退出):); int N; N=0; try N=Integer.parseInt(str); catch(NumberFormatException e) e.printStackTrace

8、(); str=(N90?A:(N60?B:C); System.out.println(str); 【程序6】 題目:輸入兩個(gè)正整數(shù)m和n,求其最大公約數(shù)和最小公倍數(shù)。 1.程序分析:利用輾除法。 最大公約數(shù):public class CommonDivisor public static void main(String args) commonDivisor(24,32); static int commonDivisor(int M, int N) if(N0|M0) System.out.println(ERROR!); return -1; if(N=0) System.out.p

9、rintln(the biggest common divisor is :+M); return M; return commonDivisor(N,M%N); 最小公倍數(shù)和最大公約數(shù):import java.util.Scanner; public class CandC /下面的方法是求出最大公約數(shù)public static int gcd(int m, int n) while (true) if (m = m % n) = 0) return n; if (n = n % m) = 0) return m; public static void main(String args) t

10、hrows Exception /取得輸入值/Scanner chin = new Scanner(System.in); /int a = chin.nextInt(), b = chin.nextInt(); int a=23; int b=32;int c = gcd(a, b); System.out.println(最小公倍數(shù): + a * b / c + n最大公約數(shù): + c); 【程序7】 題目:輸入一行字符,分別統(tǒng)計(jì)出其中英文字母、空格、數(shù)字和其它字符的個(gè)數(shù)。 1.程序分析:利用while語句,條件為輸入的字符不為 n . import java.util.Scanner;p

11、ublic class ex7 public static void main(String args) System.out.println(請輸入字符串:); Scanner scan=new Scanner(System.in); String str=scan.next(); String E1=u4e00-u9fa5; String E2=a-zA-Z; int countH=0; int countE=0; char arrChar=str.toCharArray(); String arrStr=new StringarrChar.length; for (int i=0;iar

12、rChar.length ;i+ ) arrStri=String.valueOf(arrChari); for (String i: arrStr ) if (i.matches(E1) countH+; if (i.matches(E2) countE+; System.out.println(漢字的個(gè)數(shù)+countH); System.out.println(字母的個(gè)數(shù)+countE); 【程序8】 題目:求s=a+aa+aaa+aaaa+aa.a的值,其中a是一個(gè)數(shù)字。例如2+22+222+2222+22222(此時(shí)共有5個(gè)數(shù)相加),幾個(gè)數(shù)相加有鍵盤控制。 1.程序分析:關(guān)鍵是計(jì)算出每

13、一項(xiàng)的值。 import java.io.*;public class Sumloop public static void main(String args) throws IOException int s=0; String output=; BufferedReader stadin = new BufferedReader(new InputStreamReader(System.in); System.out.println(請輸入a的值); String input =stadin.readLine(); for(int i =1;i=Integer.parseInt(input

14、);i+) output+=input; int a=Integer.parseInt(output); s+=a; System.out.println(s); 另解:import java.io.*;public class Sumloop public static void main(String args) throws IOException int s=0; int n; int t=0; BufferedReader stadin = new BufferedReader(new InputStreamReader(System.in); String input = stad

15、in.readLine(); n=Integer.parseInt(input); for(int i=1;i=n;i+) t=t*10+n; s=s+t; System.out.println(t); System.out.println(s); 【程序9】 題目:一個(gè)數(shù)如果恰好等于它的因子之和,這個(gè)數(shù)就稱為 完數(shù) 。例如6=123.編程 找出1000以內(nèi)的所有完數(shù)。 public class Wanshu public static void main(String args) int s; for(int i=1;i=1000;i+) s=0; for(int j=1;ji;j+) if

16、(i % j=0) s=s+j;if(s=i)System.out.print(i+ ); System.out.println(); 【程序10】 題目:一球從100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地時(shí),共經(jīng)過多少米?第10次反彈多高? public class Ex10 public static void main(String args) double s=0; double t=100; for(int i=1;i=10;i+) s+=t; t=t/2; System.out.println(s); System.out.println(t);

17、 【程序11】 題目:有1、2、3、4個(gè)數(shù)字,能組成多少個(gè)互不相同且無重復(fù)數(shù)字的三位數(shù)?都是多少? 1.程序分析:可填在百位、十位、個(gè)位的數(shù)字都是1、2、3、4。組成所有的排列后再去 掉不滿足條件的排列。 public class Wanshu public static void main(String args) int i=0; int j=0; int k=0; int t=0; for(i=1;i=4;i+) for(j=1;j=4;j+) for(k=1;k=4;k+) if(i!=j & j!=k & i!=k) t+=1; System.out.println(i*100+j*

18、10+k); System.out.println (t); 【程序12】 題目:企業(yè)發(fā)放的獎(jiǎng)金根據(jù)利潤提成。利潤(I)低于或等于10萬元時(shí),獎(jiǎng)金可提10%;利潤高于10萬元,低于20萬元時(shí),低于10萬元的部分按10%提成,高于10萬元的部分,可可提成7.5%;20萬到40萬之間時(shí),高于20萬元的部分,可提成5%;40萬到60萬之間時(shí)高于40萬元的部分,可提成3%;60萬到100萬之間時(shí),高于60萬元的部分,可提成1.5%,高于100萬元時(shí),超過100萬元的部分按1%提成,從鍵盤輸入當(dāng)月利潤I,求應(yīng)發(fā)放獎(jiǎng)金總數(shù)? 1.程序分析:請利用數(shù)軸來分界,定位。注意定義時(shí)需把獎(jiǎng)金定義成長整型。 impo

19、rt java .util.*; public class test public static void main (Stringargs) double sum;/聲明要儲存的變量應(yīng)發(fā)的獎(jiǎng)金 Scanner input =new Scanner (System.in);/導(dǎo)入掃描器 System.out.print (輸入當(dāng)月利潤); double lirun=input .nextDouble();/從控制臺錄入利潤 if(lirun=) sum=lirun*0.1; else if (lirun=) sum=10000+lirun*0.075; else if (lirun=) sum

20、=17500+lirun*0.05; else if (lirun=) sum=lirun*0.03; else if (lirun=) sum=lirun*0.015; else sum=lirun*0.01; System.out.println(應(yīng)發(fā)的獎(jiǎng)金是+sum); 后面其他情況的代碼可以由讀者自行完善.【程序13】 題目:一個(gè)整數(shù),它加上100后是一個(gè)完全平方數(shù),加上168又是一個(gè)完全平方數(shù),請問該數(shù)是多少? 1.程序分析:在10萬以內(nèi)判斷,先將該數(shù)加上100后再開方,再將該數(shù)加上268后再開方,如果開方后的結(jié)果滿足如下條件,即是結(jié)果。請看具體分析: public class te

21、st public static void main (Stringargs) long k=0; for(k=1;k2)/*如果是閏年且月份大于2,總天數(shù)應(yīng)該加一天*/ sum+; System.out.println(It is the the day:+sum);【程序15】 題目:輸入三個(gè)整數(shù)x,y,z,請把這三個(gè)數(shù)由小到大輸出。 1.程序分析:我們想辦法把最小的數(shù)放到x上,先將x與y進(jìn)行比較,如果x y則將x與y的值進(jìn)行交換,然后再用x與z進(jìn)行比較,如果x z則將x與z的值進(jìn)行交換,這樣能使x最小。 import java.util.*;public class test publi

22、c static void main (Stringargs) int i=0;int j=0;int k=0;int x=0;System.out.print(請輸入三個(gè)數(shù)n); Scanner input = new Scanner(System.in);i=input.nextInt();j=input.nextInt();k=input.nextInt(); if(ij) x=i; i=j; j=x; if(ik) x=i; i=k; k=x; if(jk) x=j; j=k; k=x; System.out.println(i+, +j+, +k);【程序16】 題目:輸出9*9口訣

23、。 1.程序分析:分行與列考慮,共9行9列,i控制行,j控制列。 public class jiujiu public static void main(String args)int i=0;int j=0;for(i=1;i=9;i+)for(j=1;j=9;j+)System.out.print(i+*+j+=+i*j+t); System.out.println();不出現(xiàn)重復(fù)的乘積(下三角)public class jiujiu public static void main(String args)int i=0;int j=0;for(i=1;i=9;i+)for(j=1;j=i

24、;j+)System.out.print(i+*+j+=+i*j+t); System.out.println();上三角public class jiujiu public static void main(String args)int i=0;int j=0;for(i=1;i=9;i+)for(j=i;j=9;j+)System.out.print(i+*+j+=+i*j+t); System.out.println();【程序17】 題目:猴子吃桃問題:猴子第一天摘下若干個(gè)桃子,當(dāng)即吃了一半,還不癮,又多吃了一個(gè) 第二天早上又將剩下的桃子吃掉一半,又多吃了一個(gè)。以后每天早上都吃了前一

25、天剩下 的一半零一個(gè)。到第10天早上想再吃時(shí),見只剩下一個(gè)桃子了。求第一天共摘了多少。 1.程序分析:采取逆向思維的方法,從后往前推斷。 public class 猴子吃桃 static int total(int day) if(day = 10) return 1; else return (total(day+1)+1)*2; public static void main(String args)System.out.println(total(1);【程序18】 題目:兩個(gè)乒乓球隊(duì)進(jìn)行比賽,各出三人。甲隊(duì)為a,b,c三人,乙隊(duì)為x,y,z三人。已抽簽決定比賽名單。有人向隊(duì)員打聽比賽的

26、名單。a說他不和x比,c說他不和x,z比,請編程序找出三隊(duì)賽手的名單。 1.程序分析:判斷素?cái)?shù)的方法:用一個(gè)數(shù)分別去除2到sqrt(這個(gè)數(shù)),如果能被整除, 則表明此數(shù)不是素?cái)?shù),反之是素?cái)?shù)。 import java.util.ArrayList;public class pingpang String a,b,c; public static void main(String args) String op = x, y, z ; ArrayList arrayList=new ArrayList(); for (int i = 0; i 3; i+) for (int j = 0; j 3;

27、 j+) for (int k = 0; k 3; k+) pingpang a=new pingpang(opi,opj,opk); if(!a.a.equals(a.b)&!a.b.equals(a.c)&!a.a.equals(x) &!a.c.equals(x)&!a.c.equals(z) arrayList.add(a); for(Object a:arrayList) System.out.println(a); public pingpang(String a, String b, String c) super(); this.a = a; this.b = b; this.

28、c = c; Override public String toString() / TODO Auto-generated method stub return a的對手是+a+,+b的對手是+b+,+c的對手是+c+n; 【程序19】 題目:打印出如下圖案(菱形) * * * * * * * 1.程序分析:先把圖形分成兩部分來看待,前四行一個(gè)規(guī)律,后三行一個(gè)規(guī)律,利用雙重 for循環(huán),第一層控制行,第二層控制列。 三角形:public class StartG public static void main(String args) int i=0; int j=0; for(i=1;i=

29、4;i+) for(j=1;j=1;i-) for(j=1;j=2*i-3;j+) System.out.print(*); System.out.println(); 菱形:public class StartG public static void main(String args) int i=0; int j=0; for(i=1;i=4;i+) for(int k=1; k=4-i;k+) System.out.print( ); for(j=1;j=1;i-) for(int k=1; k=5-i;k+) System.out.print( ); for(j=1;j=2*i-3;j

30、+) System.out.print(*); System.out.println(); 【程序20】 題目:有一分?jǐn)?shù)序列:2/1,3/2,5/3,8/5,13/8,21/13.求出這個(gè)數(shù)列的前20項(xiàng)之和。 1.程序分析:請抓住分子與分母的變化規(guī)律。 public class test20 public static void main(String args) float fm = 1f; float fz = 1f; float temp; float sum = 0f; for (int i=0;i20;i+) temp = fm; fm = fz; fz = fz + temp; s

31、um += fz/fm; /System.out.println(sum); System.out.println(sum); 【程序21】 題目:求1+2!+3!+.+20!的和 1.程序分析:此程序只是把累加變成了累乘。 public class Ex21 static long sum = 0; static long fac = 0;public static void main(String args) long sum = 0; long fac = 1; for(int i=1; i 1) value = n * recursion(n-1); return value;【程序2

32、3】 題目:有5個(gè)人坐在一起,問第五個(gè)人多少歲?他說比第4個(gè)人大2歲。問第4個(gè)人歲數(shù),他說比第3個(gè)人大2歲。問第三個(gè)人,又說比第2人大兩歲。問第2個(gè)人,說比第一個(gè)人大兩歲。最后問第一個(gè)人,他說是10歲。請問第五個(gè)人多大? 1.程序分析:利用遞歸的方法,遞歸分為回推和遞推兩個(gè)階段。要想知道第五個(gè)人歲數(shù),需知道第四人的歲數(shù),依次類推,推到第一人(10歲),再往回推。 public class Ex23 static int getAge(int n) if (n=1) return 10; return 2 + getAge(n-1); public static void main(String

33、 args) System.out.println(第五個(gè)的年齡為:+getAge(5); 【程序24】 題目:給一個(gè)不多于5位的正整數(shù),要求:一、求它是幾位數(shù),二、逆序打印出各位數(shù)字。 import java.util.Scanner;public class Ex24 public static void main(String args) Ex24 tn = new Ex24(); Scanner s = new Scanner(System.in); long a = s.nextLong(); if(a ) System.out.println(Error Input, please

34、 run this program Again); System.exit(0); if(a =0 & a = 10 & a = 100 & a = 1000 & a = 10000 & a =0; i-) System.out.print(chi); 【程序25】 題目:一個(gè)5位數(shù),判斷它是不是回文數(shù)。即12321是回文數(shù),個(gè)位與萬位相同,十位與千位相同。 import java.util.Scanner;public class Ex25 static int a = new int5;static int b = new int5;public static void main(Stri

35、ng args) boolean is =false; Scanner s = new Scanner(System.in); long l = s.nextLong(); if (l 99999 | l = 0; i-) ai = (int) (l / (long) Math.pow(10, i); l =(l % ( long) Math.pow(10, i); System.out.println(); for(int i=0,j=0; i5; i+, j+) bj = ai; for(int i=0,j=4; i5; i+, j-) if(ai != bj) is = false; b

36、reak; else is = true; if(is = false) System.out.println(is not a Palindrom!); else if(is = true) System.out.println(is a Palindrom!); 【程序26】 題目:請輸入星期幾的第一個(gè)字母來判斷一下是星期幾,如果第一個(gè)字母一樣,則繼續(xù) 判斷第二個(gè)字母。 1.程序分析:用情況語句比較好,如果第一個(gè)字母一樣,則判斷用情況語句或if語句判斷第二個(gè)字母。 import java.util.Scanner;public class Ex26 public static void m

37、ain(String args) /保存用戶輸入的第二個(gè)字母 char weekSecond; /將Scanner類示例化為input對象,用于接收用戶輸入 Scanner input = new Scanner(System.in); /開始提示并接收用戶控制臺輸入 System.out.print(請輸入星期值英文的第一個(gè)字母,我來幫您判斷是星期幾:); String letter = input.next(); /判斷用戶控制臺輸入字符串長度是否是一個(gè)字母 if (letter.length() = 1) /利用取第一個(gè)索引位的字符來實(shí)現(xiàn)讓Scanner接收char類型輸入 char weekFirst = letter.charAt(0); switch (weekFirst) case m: /當(dāng)輸入小寫字母時(shí),利用switch結(jié)構(gòu)特性執(zhí)行下一個(gè)帶break語句的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論