java之算法整合
题目1、有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?
思路分析:
f(1) = 1(第1个月有一只兔子)
f(2) = 1(第2个月还是一只兔子)
f(3) = 2(原来有一只兔子,第3个开始,每个月生一只兔子)
f(4) = 3(原来有只对兔子,有一只可以生育)、
f(5) = 5(原来有3只兔子,第3个月出生的那只兔子也可以生育了,那么现在有只对兔子可以生育)
f(6) = 8(原来有5只兔子,第4个月出生的那只兔子也可以生育了,那么现在有3只兔子可以生育)
代码案例:
public class Demo01 { public static void main(String args[]) { for (int 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); } }
题目2、判断101-200之间有多少个素数,并输出所有素数?
思路分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
代码案例
public class Demo02{ public static void main(String[] args){
List list = new ArrayList<>(); for(int i=101;i<=200;i++){ boolean flag=true; for(int j=2;j<i;j++){ if(i%j==0){ flag=false; break; } } if(flag==true){ System.out.print(" "+i); }
list.add(i); }
System.out.println(list.size); } }
题目3、打印出所有的 水仙花数 ,所谓 水仙花数 是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 水仙花数 ,因为153=1的三次方+5的三次方+3的三次方?
思路分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位
代码案例:
public class Demo03 { public static void main(String args[]) { math mymath = new math(); for (int 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) return true; else return false; } }
题目4、将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5?
思路分析:
对n进行分解质因数,应先找到一个最小的质数i,然后按下述步骤完成;
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n > i,但n能被i整除,则应打印出i的值,并用n除以i的商,作为新的正整数你,重复执行第一步。
(3)如果n不能被i整除,则用i+1作为i的值,重复执行第一步。
代码案例:
import java.util.Scanner; public class Demo04 { public Demo04() { super(); } public void fenjie(int n) { for (int i = 2; i <= n; i++) { if (n % i == 0) { System.out.print(i); if(n!=i){ System.out.print("*"); } fenjie(n/i); } } } public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("请输入N的值:"); int N = in.nextInt(); System.out.print( "分解质因数:" + N +"="); new Demo04().fenjie(N); } }
题目5、利用条件运算符的嵌套来完成此题:学习成绩=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示?
思路分析:(a>b)?a:b这是条件运算符的基本例子。(三目运算符)
代码案例:
import java.util.Scanner; public class Demo05 { public static void main(String[] args) { System.out.println("请输入N的值:"); Scanner in = new Scanner(System.in); int N = in.nextInt(); System.out.println(N >= 90 ?"A": (N >= 60 ? "B":"C")); } }
题目6、输入两个正整数m和n,求其最大公约数和最小公倍数?
思路分析:利用辗除法。
代码案例:
import java.util.Scanner; public class Demo06 { public static void main(String[] args){ int a,b,m,n; Scanner in=new Scanner(System.in); System.out.println("请输入一个正整数:"); a=in.nextInt(); System.out.println("再输入一个正整数:"); b=in.nextInt(); commonDivisor use=new commonDivisor(); m=use.commonDivisor(a,b); n=a*b/m; System.out.println("最大公约数:"+m); System.out.println("最小公倍数:"+n); } } class commonDivisor{ public int commonDivisor(int x,int y){ if(x<y){ int t=x; x=y; y=t; } while(y!=0){ if(x==y)return x; else{ int k=x%y; x=y; y=k; } } return x; } }
题目7、输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数?
思路分析:利用for循环语句,if条件语句。
代码案例:
import java.util.Scanner; public class Demo07 { public static void main(String[] args){ System.out.println("请输入一个字符串;"); Scanner in=new Scanner(System.in); String str=in.nextLine(); char[] ch=str.toCharArray(); count use=new count(); use.count(ch); } } class count{ int digital,character,blank,other; public void count(char[] arr){ for(int i=0;i<arr.length;i++){ if(arr[i]>='0'&&arr[i]<='9'){ digital++; }else if((arr[i]>='a'&&arr[i]<='z')||(arr[i]>='A'&&arr[i]<='Z')){ character++; }else if(arr[i]==' '){ blank++; }else{ other++; } } System.out.println("数字个数:"+digital); System.out.println("英文字母个数:"+character); System.out.println("空格个数:"+blank); System.out.println("其他字符个数:"+other); } }
题目8、求s = a + aa + aaa + aaaa + aa...a的值,其中a是一个数字。例如2 + 22 + 222 + 2222 + 22222(此时共有5个数相加),几个数相加有键盘控制?
思路分析:关键是计算出每一项的值。
代码案例:
import java.util.Scanner; public class Demo08 { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println(请输入a的值); int a = in.nextInt(); System.out.println(请输入n个数); int n = in.nextInt(); int s = 0,t=0; for (int i = 1; i <= n; i++) { t += a; a = a*10; s += t; } System.out.println(s); } }
题目9、一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3。编程找出1000以内的所有完数?
代码案例:
public class Demo09 { public static void main(String[] args) { int s; for (int i = 1; i <= 1000; i++) { s = 0; for (int j = 1; j < i; j++) if (i % j == 0) s = s + j; if (s == i) System.out.print(i + " " ); } System.out.println(); } }
题目10、一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
代码案例:
public class Demo10 { public static void main(String[] args) { double s = 0; double h = 100; for (int i = 1; i <= 10; i++) { s += h; h = h/2; s += h; } System.out.println("经过路程:"+s); System.out.println("反弹高度:"+h); } }
题目11、有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
思路分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
代码案例:
public class Demo11 { public static void main(String[] args) { int count = 0; for (int i = 1; i <= 4; i++) for (int j = 1; j <= 4; j++) for (int k = 1; k <= 4; k++) if (i != j && j != k && i != k) { count += 1; System.out.println(i*100 + j*10 + k); } System.out.println("共" + count + "个三位数"); } }
题目12、企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润lirun,求应发放奖金总数sum?
思路分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
代码案例:
import java.util.Scanner; public class Demo12 { public static void main(String[] args) { double sum; System.out.println("输入当月利润:(万元)"); Scanner in = new Scanner(System.in); double lirun = in.nextDouble(); if (lirun <= 10) { sum = lirun * 0.1; } else if (lirun <= 20) { sum = 10*0.1 + (lirun - 10) * 0.075; } else if (lirun <= 40) { sum = 10*0.1 + 10*0.075 + (lirun - 20) * 0.05; } else if (lirun <= 60) { sum = 10*0.1 + 10*0.075 + 10*0.05 + (lirun - 40) * 0.03; } else if (lirun <= 100) { sum = 10*0.1 + 10*0.075 + 10*0.05 + 10*0.03 + (lirun - 60) * 0.015; } else { sum = 10*0.1 + 10*0.075 + 10*0.05 + 10*0.03 + 10*0.015 + (lirun - 100) * 0.01; } System.out.println("应发的奖金是:"+sum+"(万元)"); } }
题目13、一个整数,它加上100后是一个完全平方数,加上168又是一个完全平方数,请问该数是多少?
思路分析:在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方,如果开方后的结果满足如下条件,即是结果。
代码案例:
public class Demo13 { public static void main(String[] args) { for(int x=1;x<100000;x++){ if(Math.sqrt(x+100)%1==0) if(Math.sqrt(x+100+168)%1==0) System.out.println(x+"加上100后是一个完全平方数,加上168又是一个完全平方数"); } } }
题目14、猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩
下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少?
代码案例:
public class Demo17 { public static void main(String[] args) { int sum = 1; for (int i = 0; i < 9; i++) { sum = (sum + 1) * 2; } System.out.println("第一天共摘"+sum); } }
题目15、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
代码案例:
public class Demo20 { public static void main(String[] args) { float fm = 1.0f; float fz = 1.0f; float temp; float sum = 0f; for (int i = 0; i < 20; i++) { temp = fm; fm = fz; fz = fz + temp; System.out.println((int) fz + "/" + (int) fm); sum += fz / fm; } System.out.println(sum); } }
题目16、求1+2!+3!+...+20!的和?
代码案例:
public class Demo21 { public static void main(String[] args) { long sum = 0; long fac = 1; for (int i = 1; i <= 20; i++) { fac = fac * i; sum += fac; } System.out.println(sum); } }
题目17、利用递归方法求5!?
代码案例:
import java.util.Scanner; public class Demo22 { public static long fac(int n) { long value = 0; if (n == 1 || n == 0) { value = 1; } else if (n > 1) { value = n * fac(n - 1); } return value; } public static void main(String[] args) { System.out.println("请输入一个数:"); Scanner in = new Scanner(System.in); int n = in.nextInt(); System.out.println(n + "的阶乘为:" + fac(n)); } }
题目18、有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两
岁。最后问第一个人,他说是10岁。请问第五个人多大?
思路分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
代码案例:
public class Demo23 { public static int getAge(int n) { if (n == 1) { return 10; } return 2 + getAge(n - 1); } public static void main(String[] args) { System.out.println("第五个的年龄为" + getAge(5)); } }
题目19、给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
代码案例:
import java.util.Scanner; public class Demo24 { public static void main(String[] args) { System.out.println("请输入:"); Scanner in = new Scanner(System.in); String str = in.next(); if (str.matches("\\d+")) { //正则表达式 System.out.println("输入的是" + str.length() + "位数"); StringBuffer buf = new StringBuffer(str); System.out.println(buf.reverse());//字符串反转 } } }
题目20、求100之内的素数?
代码案例:
public class Demo27 { public static void main(String args[]) { int sum, i; for (sum = 2; sum <= 100; sum++) { for (i = 2; i <= sum / 2; i++) { if (sum % i == 0) break; } if (i > sum / 2) System.out.println(sum + "是素数"); } } }