logo资料库

经典算法50题.doc

第1页 / 共36页
第2页 / 共36页
第3页 / 共36页
第4页 / 共36页
第5页 / 共36页
第6页 / 共36页
第7页 / 共36页
第8页 / 共36页
资料共36页,剩余部分请下载后查看
经典算法40题
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,  
N=0;
N=0;
Scanner input =new Scanner (System.in);//导入扫描器
}else if (lirun<=200000){
}else if (lirun<=400000){
}else if (lirun<=600000){
}else if (lirun<=1000000){
} else{
} else if(n > 1) {
经典算法 40 题 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多 少? (1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765) 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... public class exp2{ public 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) else return 1; return f(x-1)+f(x-2); } 或 public class exp2{ public 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 math { public int f(int x) { if(x==1 || x==2) else return 1; return f(x-1)+f(x-2); } } } } 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public class Sushu { public static void main(String[] args) { int i,j,count=0; for (i = 101; i <= 200; i++) // 101-200的数 for (j = 2; j <= (int)Math.sqrt(i); j++) { { } { if (i % j == 0) break; if (j > (int)Math.sqrt(i))
count++; System.out.println(i); } } System.out.println("从101到200间有" + count + "个素数。"); } } (2,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55, 57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99,101,103,105,107, 109,111,113,115,117,119,121,123,125,127,129,131,133,135,137,139,141,143,145,147,1 49,151,153,155,157,159,161,163,165,167,169,171,173,175,177,179,181,183,185,187,18 9,191,193,195,197,199) 【程序3】 题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例 如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 (结果:153、370、371、407) public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=100;i<=999;i++) if(mymath.shuixianhua(i)==true) System.out.println(i); } } class math { 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) else return true; return false; } } 【程序4】 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n <> k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 public class exp2{ public exp2(){} public void fengjie(int n){ for(int i=2;i<=n/2;i++){ if(n%i==0){ System.out.print(i+"*"); fengjie(n/i); } } System.out.print(n); System.exit(0);///不能少这句,否则结果会出错 } public static void main(String[] args){
String str=""; exp2 c=new exp2(); str=javax.swing.JOptionPane.showInputDialog("请输入N的值(输入exit退出): int N; N=0; try{N=Integer.parseInt(str);} catch(NumberFormatException e){e.printStackTrace();} System.out.print(N+"分解质因数:"+N+"="); c.fengjie(N); "); } } 【程序 5】 题目:利用条件运算符的嵌套来完成此题:学习成绩> =90 分的同学用 A 表示,60-89 分之间的用 B 表示, 60 分以下的用 C 表示。 1.程序分析:(a> b)?a:b 这是条件运算符的基本例子。 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(); } str=(N>90?"A":(N>60?"B":"C")); System.out.println(str); } } 【程序 6】 题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数。 1. 程序分析:利用辗除法。 /* *在循环中,只要除数不等于 0,用较大数除以较小的数,将小的一个数作为下一轮循环的大数, *取得的余数作为下一轮循环的较小的数,如此循环直到较小的数的值为 0,返回较大的数, *此数即为最大公约数,最小公倍数为两数之积除以最大公约数。 * / 最大公约数: public class CommonDivisor{ public static void main(String args[]) { commonDivisor(24,32);// 最小公倍数:96 最大公约数:8 } static int commonDivisor(int M, int N) { if(N<0||M<0)
System.out.println("ERROR!"); return -1; { } if(N==0) { System.out.println("the biggest common divisor is :"+M); return M; } return commonDivisor(N,M%N); } } 最小公倍数和最大公约数: import java.util.Scanner; public class CandC { //下面的方法是求出最大公约数 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[]) throws 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("最小公倍数:" + a * b / c + "\n最大公约数:" + c); //最小公倍数:736, 最大公约数:1 } } 最小公倍数和最大公约数: import java.util.Scanner; //import javax.swing.*; public class gs{ public static void main(String args[])throws Exception { int a,b,m,n,temp; m=0;
n=0; System.out.println("Please input two numbers:"); //String str=JOptionPane.showInputDialog("请输入一个数:"); //String str1=JOptionPane.showInputDialog("请输入另一个数:"); //m=Integer.parseInt(str); //n=Integer.parseInt(str1); Scanner scanner=new Scanner(System.in); m=scanner.nextInt(); n=scanner.nextInt(); if(m
for (String i: arrStr ) { if (i.matches(E1)) { countH++; } if (i.matches(E2)) { countE++; } } System.out.println("汉字的个数"+countH); System.out.println("字母的个数"+countE); } } 更好的解法: import java.util.*; public class lianxi07{ public static void main(String[] args) { // TODO Auto-generated method stub int abcCount=0;//英文字母个数 int spaceCount=0;//空格键个数 int numCount=0;//数字个数 int otherCount=0;//其他字符个数 Scanner scan=new Scanner(System.in); String str=scan.nextLine(); char[] ch = str.toCharArray(); for(int i=0;i
} System.out.println("字母个数:"+abcCount); System.out.println("数字个数:"+numCount); System.out.println("空格个数:"+spaceCount); System.out.println("其他字符个数:"+otherCount); } } 【程序 8】 题目:求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字。例如 2+22+222+2222+22222(此时 共有 5 个数相加),几个数相加有键盘控制。 1.程序分析:关键是计算出每一项的值。 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);i++) { output+=input; int a=Integer.parseInt(output); s+=a; }er 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 = stadin.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】 题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如 6=1+2+3.编程 找出 1000 以内 的所有完数。 public class Wanshu {// 6,28,496 public static void main(String[] args) { int s; for(int i=1;i<=1000;i++) { s=0; for(int j=1;j
分享到:
收藏