JAVA 经典算法 40 题
1 古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第四个
月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
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)
return 1;
else
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)
return 1;
else
return f(x-1)+f(x-2);
}
}
2 判断 101-200 之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除 2 到 sqrt(这个数),如果能被整除,
则表明此数不是素数,反之是素数。
public class exp2{
public 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 math {
public int f(int x) {
if(x==1 || x==2)
return 1;
else
return 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;
}
}
3 打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数
字立方和等于该数本身。例如:153 是一个 "水仙花数 ",因为 153=1 的三次方+5 的
三次方+3 的三次方。
1.程序分析:利用 for 循环控制 100-999 个数,每个数分解出个位,十位,百位。
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 int f(int x) {
if(x==1 || x==2)
return 1;
else
return 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 true;
else
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(NumberFormatExcepti
on e){
e.printStackTrac
e();
}
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.程序分析:利用辗除法。
最大公约数:
public class CommonDivisor{
public static void main(String args[]) { commonDivisor(24,32)
; }
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);
}
}