JAVA经典算法40题
来源:互联网 发布:c语言编译器安卓版 编辑:程序博客网 时间:2024/06/08 04:06
刷题开始!
题目1:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
总结规律: 1 1 2 3 5 8 13 —
其实就是一个数列,前一项 + 后一项 = 现在这一项,用递归最快,最简单
public class Demo01 { public static void main(String[] args) { for(int i = 1; i < 12; i++) { System.out.print("第" + i + "月" + "有 " + tuzi(i) + "只\n"); } } public static int tuzi(int month) { if (month == 1 || month == 2) { return 1; } return tuzi(month-1) + tuzi(month-2); }}
题目2:判断101-200之间有多少个素数,并输出所有素数
public class Demo2 { public static void main(String[] args) { for (int i = 101; i < 200; i++) { if (isSuShu(i)) { System.out.print(i + " "); } } } public static boolean isSuShu(int x) { boolean flag = false; for (int i = 2; i <= Math.sqrt(x); i++) { if(x%i==0) { flag = false; break; } flag = true; } return flag; }}
注意一下,在Math.sqrt中,要<=, 不然会出问题
题目3:打印出所有的 “水仙花数 “,所谓 “水仙花数 “是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 “水仙花数 “,因为153=1的三次方+5的三次方+3的三次方。
public class Demo3 { public static void main(String[] args) { for (int i = 100; i < 1000; i++) { int b = i /100; int s = i/10%10; int g = i%10; if (i == (b*b*b + s*s*s + g*g*g)) { System.out.print( i + " "); } } }}
主要是对三位数进行拆分位数
题目4:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
public class Demo4 { public static void main(String[] args) { int value = new Scanner(System.in).nextInt(); int flag = 0; for (int i = 2; i <= value; i++) { while(value % i ==0) { flag++; if (flag == 1) { System.out.print(value + "=" + i); }else { System.out.print("*" + i); } value = value/i; } } } }
题目5:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
public class Demo5 { public static void main(String[] args) { System.out.println("请输入学成成绩:"); int value = new Scanner(System.in).nextInt(); String str = ""; if (value >= 90) { str = "A"; } else if (value >= 60 && value < 89) { str = "B"; } else { str = "C"; } System.out.println("成绩等级为: " + str); }}
题目6:输入两个正整数m和n,求其最大公约数和最小公倍数。
public class Demo6 { public static void main(String[] args) { System.out.println("请输入十个数字: "); Scanner input = new Scanner(System.in); int m = input.nextInt(); int n = input.nextInt(); int t = n*m; if(n > m) { int temp = n; n = m; m = temp; } int temp; while( m%n != 0) { temp = m%n; m = n; n = temp; } System.out.println("最大公约数" + n + " 最小公倍数" + t/n ); }}
个人觉得这题,有点迷糊,主要是概念不清
点击一下 : 概念
题目7:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
public class Demo7 { public static void main(String[] args) { System.out.println("请输入一行字符: "); String data = new Scanner(System.in).nextLine(); int y = 0; int s = 0; int k = 0; int q = 0; char[] cs = data.toCharArray(); for (int i = 0; i < cs.length; i++) { if (cs[i] >='A' && cs[i] <='z') { y++; } else if (cs[i] >= '0' && cs[i] <= '9') { s++; } else if (cs[i] == ' ') { k++; } else { q++; } } System.out.println("字母个数: " + y); System.out.println("空格个数: " + k); System.out.println("数字个数: " + s); System.out.println("其它个数: " + q); }}
很多人,用正则表达式,但我觉得我这个是最简单的,直接利用字符串转换成字节数组,再一个一个判断
题目8:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
public class Demo8 { public static void main(String[] args) { System.out.println("请输入多少项,由你决定 : "); int n = new Scanner(System.in).nextInt(); long sum = 0; long s = 0; for (int i = 0; i < n; i++) { sum = sum * 10 + n; s = s + sum; } System.out.println("数值为: " + s); }}
主要是利用x不断的*10 倍再加上上一次的数,这个是小技巧
题目9:一个数如果恰好等于它的因子之和,这个数就称为 “完数 “。例如6=1+2+3.编程 找出1000以内的所有完数。
public class Demo9 { public static void main(String[] args) { for (int i = 1; i < 1000; i++) { if (i == yinZi(i)) { System.out.println(i); } } } public static int yinZi(int d) { int sum = 0; for (int i = 1; i < d; i++) { if (d % i == 0) { sum += i; } } return sum; }}
题目10:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
public class Demo10 { public static void main(String[] args) { double last = 100; double sum = 0; for (int i = 0; i < 10; i++) { sum = sum + last; last = last/2; } System.out.println("共经过: " + sum + "米"); System.out.println("第10次反弹 " + last + "米"); }}
关键是题目看懂,要注意用double, 因为有小数,不然结果最后为0了,别问我怎么知道
题目11:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
public class Demo11 { public static void main(String[] args) { for (int i = 1 ; i <= 4; i++) { for (int j = 1; j <= 4; j++) { for (int k = 1; k <= 4; k++) { if (i!=j && i!=k &&j !=k ) { System.out.println(i +"" + j + "" + k); } } } } }}
这是水仙花典型题型,不说了,太简单了
题目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%提成,从键盘输入当月利润,求应发放奖金总数?
public class Demo12 { public static void main(String[] args) { System.out.println("请输入月利润: "); int money = new Scanner(System.in).nextInt(); double sum = 0; if (money <= 10) { sum = sum * 0.1; } else if (money > 10 && money <= 20) { sum = 10 * 0.1 + (money - 10) * 0.075; } else if (money > 20 && money <= 40) { sum = 10 * 0.1 + 10 * 0.075 + (money - 20) * 0.05; } else if (money > 40 && money <= 60) { sum = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + (money - 40) * 0.03; } else if(money > 60 && money <= 100) { sum = 10 * 0.1 + 10 * 0.075 + 20 *0.05 + 40 * 0.03 + (money - 60) * 0.015; } else if (money > 100) { sum = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 40 * 0.03 + 60 * 0.015 + (money - 100) * 0.01; } System.out.println("sum " + sum + "万"); }}
主要是数学思维,要小心仔细
题目13:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
public class Demo13 { public static void main(String[] args) { long a; long b; for (int i = 0; i < 100000; i++) { a = (long)Math.sqrt(i+100); b = (long)Math.sqrt(i+100+168); if ( (a*a == (i+100)) && (b*b == (i + 100 + 168) )) { System.out.println(i); } } }}
题目14:输入某年某月某日,判断这一天是这一年的第几天?
public class Demo14 { public static void main(String[] args) { System.out.println("输入年 月日 : "); Scanner input = new Scanner(System.in); int year = input.nextInt(); int month = input.nextInt(); int day = input.nextInt(); int sum = 0; int te = 0; if (isR(year)) { te = 29; } else { te = 28; } switch (month) { case 2: sum = 31; break; case 3: sum = 31 + te; break; case 4: sum = 31 + te + 31; break; case 5: sum = 31 + te + 31 + 30; break; case 6: sum = 31 + te + 31 + 30 + 31; break; case 7: sum = 31 + te + 31 + 30 + 31 + 30; break; case 8: sum = 31 + te + 31 + 30 + 31 + 30 + 31; break; case 9: sum = 31 + te + 31 + 30 + 31 + 30 + 31 + 31; break; case 10: sum = 31 + te + 31 + 30 + 31 + 30 + 31 + 31 + 30; break; case 11: sum = 31 + te + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31; break; case 12: sum = 31 + te + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30; break; default: } System.out.println("第" + (sum + day) +"天"); } public static boolean isR(int year) { boolean flag = false; if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) { flag = true; } return flag; }}
原谅我的笨方法
题目15:输入三个整数x,y,z,请把这三个数由小到大输出。
public class Demo15 { public static void main(String[] args) { System.out.println("请输入3个数字: "); Scanner input = new Scanner(System.in); int a = input.nextInt(); int b = input.nextInt(); int c = input.nextInt(); System.out.println("三个数字为: " + a + " " + b + " " +c); if(a > b) { a = a^b; b = a^b; a = a^b; } if(a > c) { a = a^c; c = a^c; a = a^c; } if (b > c) { b = b^c; c = b^c; b = b^c; } System.out.println("之后的数值: " + a + " " + b + " " + c); }}
呜呜,好累,大家让我休息下,代码已发到我的github,大家有需要,可以点击下载
点击基础试题下载
0 0
- Java经典算法40题 经典!
- JAVA经典算法40题
- JAVA经典算法40题
- JAVA经典算法40题
- Java 经典算法40题
- JAVA经典算法40题
- JAVA经典算法40题
- JAVA经典算法40题
- JAVA经典算法40题
- JAVA经典算法40题
- JAVA经典算法40题
- JAVA经典算法40题
- java经典算法40题
- JAVA经典算法40题
- JAVA经典算法40题
- JAVA经典算法40题
- JAVA经典算法40题
- JAVA经典算法40题
- HDU 1016 Prime Ring Problem
- PHP session的销毁是三种方式
- 网站缓存技术
- libevent源码分析:backend的选择
- hdu-4313-并查集
- JAVA经典算法40题
- Android滚动原理及实现
- JavaEE学习笔记之Servlet/JSP—EL表达式
- 设计模式(1)-面向对象的设计原则
- Wrong FS: hdfs expected: file:
- C++ 判断一幅图片中的两个矩形区域是否邻近
- HDU 1241 Oil DepositsOil Deposits
- libevent源码分析:epoll
- mybatis学习日记——01