Java逻辑控制及实例
输入输出
import java.util.Scanner; public class TestDemo1{ public static void main(String[] args){ Scanner scan =new Scanner (System.in); int a=scan.nextInt();//输入一个整型 System.out.println(a); String str=scan.next();//输入一个字符串 System.out.println(str); } }
要是使用
String str=scan.nextLine(); System.out.println(str);
打印出数字之后就会结束程序,因为str把回车键录了进去,所以读入int和String 类型时,应该使用String str=scan.next();
使用scan.next读到空格就结束了,而使用scan.nextLine可以正常读入带有空格的字符串
import java.util.Scanner; public class TestDemo2{ public static void main(String[] args){ Scanner scan =new Scanner (System.in); int a=scan.nextInt(); System.out.println(a); //String str=scan.nextLine();//会读入空格,无法录入字符串 //System.out.println(str); String str=scan.next();//可以接着数字后面输入字符串 System.out.println(str); } } //但是单独输入字符串,String str=scan.nextLine()就可以打印出带空格的完整的字符串,而 //String str=scan.next()只会打印到空格之前的字符串
顺序结构
正常写就行
分支结构
if else
if括号里面的必须是布尔类型的表达式
eg:if(a==10)
判断闰年
import java.util.Scanner;//包 public class TestDemo1{ public static void main(String[] args){ Scanner scan =new Scanner (System.in); while(scan.hasNextInt()){ //多组输入 int year=scan.nextInt(); if((year%4==0&&year%100!=0)||(year%400==0)) { System.out.println("闰年"); } else { System.out.println("不是闰年"); } } } }
else会与最近的未匹配的if结合
if语句只会进入一个条件里面
(多组输入结束的方法:按ctrl+C(强制终止)或者 ctrl+D也可以结束程序)
switch语句
import java.util.Scanner; public class TestDemo1{ public static void main(String[] args){ Scanner scan =new Scanner (System.in); while(scan.hasNextInt()){ //多组输入 int a=scan.nextInt(); switch(a){ //写switch语句时,(在没有特殊情况下)不要忘记写break case 1: System.out.println("1"); break; case 2: System.out.println("2"); break; default : System.out.println("错误"); break; } } } }
哪些类型不能作为switch参数?
long float double boolean
String 和 枚举也是可以作为switch的参数
循环语句
while循环
与if语句一样,while语句后面的参数也要是boolean类型
public class TestDemo2{ public static void main(String[] args){ int a=10; while(a>=0){ System.out.println("yes"); a--; } } }
求5的阶乘
public class TestDemo2{ public static void main(String[] args){ int i=1; int ret=1; int num=5; int sum=0; while(i<=5){ ret*=i; i++; sum+=ret; } System.out.println(sum); } }
break与continue
break是跳出循环,break是在循环和循环中使用
continue是解释本次循环,continue只能在循环中使用
for循环
//求5!+4!+3!+2!+1! import java.util.Scanner; public class TestDemo3 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int a=scan.nextInt();//5 int ret=1; int sum=0; //方法一: for(int j=1;j<=a;j++){ for(int i=1;i<=j;i++){ ret*=i; } sum+=ret; ret=1;//记得重置 } System.out.println(sum); //方法二: //for(int i=1;i<=a;i++){ // ret*=i; // sum+=ret; // //} //System.out.print(sum); } }
求n!+(n-1)!+(n-2)!+………+1!(多组输入)
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); int i = 1; int ret = 1; int sum=0; while (i<=n) { ret *= i; sum += ret; i++; } System.out.println(sum); }
do{ 循环语句; }while(循环条件); 先执行循环语句, 再判定循环条件.
猜数字游戏
import java.util.Random; import java.util.Scanner; public class GuessNumbers { public static void main(String[] args) { Scanner scan=new Scanner(System.in); Random random = new Random(); int randNum = random.nextInt(100);[0-99] while (true) { System.out.println("请输入数字:"); int num = scan.nextInt(); if (num < randNum) System.out.println("猜小了"); else if (num > randNum) { System.out.println("猜大了"); } else { System.out.println("恭喜你,猜对了"); break; } } } }
根据年龄, 来打印出当前年龄的人是少年(低于18), 青年(19-28), 中年(29-55), 老年(56以上)
import java.util.Scanner; public class JudgeAge { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n=scanner.nextInt(); if (n <= 18) { System.out.println("少年"); } else if (n < 28) { System.out.println("青年"); } else if (n <= 55) { System.out.println("中年"); } else { System.out.println("老年"); } } } }
打印 1 - 100 之间所有的素数
public class PrintPrimeNum { public static void main(String[] args) { int count = 0; int j = 0; for (int i = 1; i <= 100; i += 2) { for (j = 2; j <= Math.sqrt(i); j++) { if (i % j == 0) { break; //i就不是素数了 } } if (j > Math.sqrt(i)) { System.out.print(i+" "); count++; } //每行打印6个数字 if (count % 6 == 0) { System.out.println(); } } } }
最大公约数(辗转相除法)
import java.util.Scanner; public class GCD { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int a=scanner.nextInt(); int b=scanner.nextInt(); while (a % b != 0) { int c = a % b; a = b; b = c; } System.out.println(b); } } }
输入密码
import java.util.Scanner; public class Password { public static void main(String[] args) { int n = 3; while (n != 0) { Scanner scanner = new Scanner(System.in); System.out.println("请输入密码:"); String str=scanner.nextLine(); if (str.equals("123456")) { System.out.println("密码正确"); break; } n--; if (n == 0) { System.out.println("你已经失去机会"); break; } System.out.println("你还有"+n+"次机会"); } } }
do while 循环
先执行在判断
public static void main(String[] args) { int i = 0; int sum=0; do { sum += i; i++; } while (i<=10); System.out.println(sum); }
综合练习
水仙花数的变种
求出n以内的所有的特殊数字
public static void find(int n) { for (int i = 1; i <=n; i++) { int tmp = i; int count = 0; int sum = 0;//记得将sum放在for循环里面,因为每次if判断完回来都要将sum置空 while (tmp != 0) { count++; tmp/=10; } tmp = i; while (tmp != 0) { sum+=Math.pow(tmp % 10, count); tmp /= 10; } if (sum == i) { System.out.println(i); } } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); find(n); } }
求一个数的二进制中有多少个1
事实上,只要 &1 就可以得到一个数的最右边的二进制位
方法一:(& >>>)
public static int numOfOne(int n) { int count = 0; while (n != 0) { if ((n & 1) == 1) { //n&1就是取出最右边的二进制数 count++; } n = n >>> 1;//无符号右移是为了在左边补0,要是直接>>就会补符号位 } return count; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); System.out.println(numOfOne(n)); } }
方法二 (&下一个数) :(更加好)
public static int numOfOne(int n) { int count = 0; while (n != 0) { count++; n = n & (n - 1); } return count; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); System.out.println(numOfOne(n)); } }
取出一个数的奇数位和偶数位
public static void print(int n) { for (int i = 30; i>=0 ; i-=2) { System.out.print(((n>>i) & 1)+" "); } System.out.println(); for (int i = 31; i >=0; i-=2) { System.out.print(((n>>i) & 1)+" "); } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); print(n); } }