2017-03-08-switch判断某一年的某天是这一年的第几天 实例1:
定义三个整数5,9,2,请把这三个数由小到大输出。
思路:
1.通过多次if判断将数的大小比较出来
2.使用冒泡排序算法
if判断的核心代码:
1)思路较为清晰地算法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public void test16 () { int a = 5 , b = 9 , c = 2 ; if (a > b) { if (b > c) { System.out.println(c + b + a); } else if (a > c) { System.out.println(b + c + a); } else { System.out.println(b + a + c); } } else if (c > b) { System.out.println(a + b + c); } else if (c > a) { System.out.println(a + c + b); } else { System.out.println(c + a + b); } }
2)根据集合来判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public void test11 () { int a = 5 , b = 9 , c = 2 ; if (a > b && a > c) { System.out.println(a); } else if (b > a && b > c) { System.out.println(b); } else { System.out.println(c); } if ((a > b && a < c) || (a < b && a > c)) { System.out.println(a); } else if ((b > a && b < c) || (b < a && b > c)) { System.out.println(b); } else { System.out.println(c); } if (a < b && a < c) { System.out.println(a); } else if (b < a && b < c) { System.out.println(b); } else { System.out.println(c); } }
使用排序算法的核心代码:
1)使用时间换空间:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public void test12 () { int a = 5 , b = 9 , c = 2 ; 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); }
2)使用空间换时间:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public void test9 () { int a = 5 , b = 9 , c = 2 ; if (a > b) { int x = a; a = b; b = x; } if (a > c) { int x = a; a = c; c = x; } if (b > c) { int x = b; b = c; c = x; } System.out.println("从小到大排列为:" + a + " " + b + " " + c); }
使用三目运算符的一些方式:
1)实际上也是冒泡排序算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public void test8 () { int a = 5 , b = 9 , c = 2 ; int min = a < b ? a : b; int max = a < b ? b : a; a = min; b = max; min = a < c ? a : c; max = a < c ? c : a; a = min; c = max; min = b < c ? b : c; max = b < c ? c : b; b = min; c = max; System.out.println("从小到大排列为:" + a + " " + b + " " + c); }
实例2:
输出1~100内前5个可以被整除的数。
思路:就是for循环再加一个计数器
核心代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public void test10 () { System.out.println("前5个能被3整除的数有:" ); for (int i = 1 , count = 1 ; i < 101 ; i++) { if (i % 3 == 0 ) { count++; System.out.print(i + " " ); if (count > 5 ) { break ; } } } }
实例3:
输出9*9的乘法表。
思路:双层for循环,外层控制行数,里层控制列数
核心代码:
1 2 3 4 5 6 7 8 public void test17 () { for (int i=1 ;i<10 ;i++){ for (int j=1 ;j<=i;j++){ System.out.print(i+"*" +j+"=" +(i*j)+"\t" ); } System.out.println(); } }
实例4:
输出100~200之间的质数。
思路:先将100~200之间的数通过for循环遍历出来,再判断质数,最后输出质数
核心代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 public void test2 () { for (int i=100 ;i<201 ;i++){ boolean flag=true ; for (int j=2 ;j<i;j++){ if (i%j==0 ){ flag=false ; } } if (flag){ System.out.println(i+" " ); } } }
注意:设置布尔判断标志的时候,注意标志的位置,如果初始化位置放错了,结果就只会判断一次,后面的效果就看不到了。
实例5:
判断1995年10月3日是这一年的第几天?
错误的思路:先进入判断这一年是不是闰年,闰年的2月天数会多一天,如果是闰年,判断月份,大于2月的情况,天数加1 判断闰年,非整百年,整除4;整百年:整除400 月份分为大月和小月,用switch将每个月都不同
简单的思路:先判断月份,将月份的天数通过穿透的switch来累加,然后再判断月份是否大于2,再判断是否是闰年,最后得出结果
核心代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 public void test3 () { int year = 1995 , month = 10 , day = 3 , sum = 0 ; if (month > 2 ) { switch ((month-1 )){ case 11 : sum+=30 ; case 10 : sum+=31 ; case 9 : sum+=30 ; case 8 : sum+=31 ; case 7 : sum+=31 ; case 6 : sum+=30 ; case 5 : sum+=31 ; case 4 : sum+=30 ; case 3 : sum+=31 ; case 2 : sum+=28 ; case 1 : sum+=31 ; case 0 : sum+=0 ; break ; default : System.out.println("月份有问题" ); break ; } sum+=day; if (((year % 100 != 0 ) && (year % 4 == 0 ) )|| (year % 400 == 0 )) { sum++; } }else { sum=day; } System.out.println(sum); }
实例6:
将一个偶数分解为两个质数相加。
思路:先用穷举法将偶数分解为两个数相加,再判断分解的数是不是质数
核心代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public void test4 () { Scanner sc=new Scanner (System.in); System.out.println("请输入一个偶数" ); int n=sc.nextInt(); if (n%2 ==0 ){ for (int i=1 ;i<=(n/2 );i++){ if ((test5(i))&&test5(n-i)){ System.out.println(n+"=" +i+"+" +(n-i)); } } }else { System.out.println("对不起,你输入的不是整数。" ); } } public boolean test5 (int n) { for (int i=2 ;i<n;i++){ if (n%i==0 ){ return false ; } } return true ; }
一个方法的核心代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public void test7 () { Scanner sc = new Scanner (System.in); System.out.println("请输入一个偶数" ); int n = sc.nextInt(); if (n % 2 == 0 ) { for (int i = 1 ; i <= (n / 2 ); i++) { boolean flag1=true ; boolean flag2=true ; for (int j=2 ;j<i;j++){ if (i%j==0 ){ flag1=false ; } } for (int j=2 ;j<(n-i);j++){ if ((n-i)%j==0 ){ flag2=false ; } } if (flag1&&flag2){ System.out.println(n+"=" +i+"+" +(n-i)); } } } else { System.out.println("对不起,你输入的不是整数。" ); } }
实例7:
菲波那切数列:1,1,2,3,5,8……..
已知项数求具体的值。
思路:
1.递归
2.不用递归,可以是数组,也可以不使用数组
使用递归的核心代码:
1 2 3 4 5 6 7 8 9 10 11 public int test10 (int n) { int result=1 ; if (n>2 ){ result=test10(n-1 )+test10(n-2 ); } return result; }
不使用递归的核心代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public int test7 (int n) { int f = 1 , s = 1 , t = 1 ; if (n > 2 ) { for (int i = 3 ; i <= n; i++) { f = s; s = t; t = f + s; } return t; } else { return f; } }
实例8:
台阶问题:一个人上上台阶,可以一次上1阶,也可以一次上2阶,有n阶台阶,求有多少种上法 * * 分析: 【1】1 【2】2 【3】3 【4】5 【5】8 【6】13 【7】21 【8】34 * * 通过观察可以发现:是菲波那切数列的变种,可以通过递归和不用递归的方法来做,只要将规律传递下去就行了。 * 1,2,3,5,8,13,21 * f s t(n=3) * f s t(n=4) * 使用递归实现的台阶问题解法 */
递归实现核心代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public int test8 (int n) { int result = 1 ; if (n == 1 ) { } else if (n == 2 ) { result = 2 ; } else { result = test8(n - 1 ) + test8(n - 2 ); } return result; }
不使用递归核心代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public int test9 (int n) { int result = 1 ; int f = 1 , s = 2 , t = 3 ; if (n > 2 ) { for (int i = 4 ; i <= n; i++) { f=s; s=t; t=f+s; result=t; } }else if (n==1 ){ result=f; }else if (n==2 ){ result=s; }else { result=t; } return result; }
实例9:
题目:将一个正整数分解质因数。例如:输入90,打印出90=23 3*5。
较为高级的实现核心代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package com.gongsi.xiexi2;import java.util.Scanner;public class Ys {public static void main (String[] args) {Scanner bi=new Scanner (System.in); System.out.println("请输入一个要分解的数" ); int a=bi.nextInt();System.out.print(a+"=" ); if (a>2 ){for (int i = 2 ; i < a; i++) {if (a%i==0 ){System.out.print(i+"*" ); a=a/i; i-=1 ; } } System.out.print(a); } else {System.out.print(a); } } }
我的复杂的思维方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 public void test13 (int n) { for (int i = 2 ; i < n; i++) { if (test14(i) && n % i == 0 ) { int a = i; int b = n / a; System.out.print("*" + a); if (test14(b)) { System.out.print("*" + b); break ; } else { test13(b); break ; } } } } public boolean test14 (int n) { for (int i = 3 ; i < n; i += 2 ) { if (n % i == 0 ) { return false ; } } return true ; }
实例10:
水仙花数问题
核心代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public void test3 () { int a = 0 , b = 0 , c = 0 ; for (int i = 100 ; i < 1000 ; i++) { a = i / 100 ; b = (i - 100 * a) / 10 ; c = i - 100 * a - 10 * b; if (i == a * a * a + b * b * b + c * c * c) { System.out.println(i + "这个数是水仙花数。" ); } } }