-
使用一个max和一个输出语句,可以替代自己在分支结构中(if…else)使用多个输出语句来输出结果 -
通过求商让case 常量:中的case变少
上面是合并改写,简化代码。
优化代码:
这里的swith-case语句没有使用break语句,以及取值是倒着写的,还有就是sumDays +=的使用,依次从上往下执行时,用到了同一个变量,但是最后得到了不同的值,有点类似于下面的这个循环语句
for (i=1;)
i += 2;
/*
从键盘分别输入年、月、日,判断这一天是当年的第几天
注: 判断一年是否是闰年的标准:
1)可以被4整除,但是不可以被100整除
或
2)可以被400整除
*/
import java.util.Scanner;
class SwitchCaseTest2
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
System.out.println("请输入年份:");
int year = scan.nextInt();
System.out.println("请输入月份:");
int month = scan.nextInt();
System.out.println("请输入天数:");
int day = scan.nextInt();
int sumDays = 0;
int runYearDay,pinYearDay;
switch (month)
{
case 12:
sumDays += 30;
case 11:
sumDays += 31;
case 10:
sumDays += 30;
case 9:
sumDays += 31;
case 8:
sumDays += 31;
case 7:
sumDays += 30;
case 6:
sumDays += 31;
case 5:
sumDays += 30;
case 4:
sumDays += 31;
case 3:
if ((year % 4 == 0) && (year % 100 != 0) )
{
runYearDay = 29;
sumDays += runYearDay;
}
else if (year % 400 == 0)
{
runYearDay = 29;
sumDays += runYearDay;
}
else
{
pinYearDay = 28;
sumDays += pinYearDay;
}
case 2:
sumDays += 31;
case 1:
sumDays += day;
}
System.out.println(year + "年" + month + "月" + day + "日" + "是当年的第" + sumDays + "天");
}
}
优化后的代码
/*
从键盘分别输入年、月、日,判断这一天是当年的第几天
注: 判断一年是否是闰年的标准:
1)可以被4整除,但是不可以被100整除
或
2)可以被400整除
*/
import java.util.Scanner;
class SwitchCaseTest2
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
System.out.println("请输入年份:");
int year = scan.nextInt();
System.out.println("请输入月份:");
int month = scan.nextInt();
System.out.println("请输入天数:");
int day = scan.nextInt();
int sumDays = 0;
//int runYearDay,pinYearDay;
switch (month)
{
case 12:
sumDays += 30;
case 11:
sumDays += 31;
case 10:
sumDays += 30;
case 9:
sumDays += 31;
case 8:
sumDays += 31;
case 7:
sumDays += 30;
case 6:
sumDays += 31;
case 5:
sumDays += 30;
case 4:
sumDays += 31;
case 3:
/*if ((year % 4 == 0) && (year % 100 != 0) )
{
runYearDay = 29;
sumDays += runYearDay;
}
else if (year % 400 == 0)
{
runYearDay = 29;
sumDays += runYearDay;
}
else
{
pinYearDay = 28;
sumDays += pinYearDay;
}*/
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
{
sumDays += 29;
}
else
{
sumDays += 28;
}
case 2:
sumDays += 31;
case 1:
sumDays += day;
}
System.out.println(year + "年" + month + "月" + day + "日" + "是当年的第" + sumDays + "天");
}
}
/*
题目:100以内所有质数的输出:
质数的概念:质数也称为素数,是指只能被1和它本身整除的数(相当于该数的约数只有1和它本身)
根据定义可以知道,最小的质数是2,特别注意,1不是质数
*/
class PrimeNumberTest
{
public static void main(String[] args)
{
int count = 0;
for (int i = 2; i <= 100; i++)
{
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
System.out.println(i + "不是质数");
break;
}
else //仔细想想这个else是有问题的
//比如:15 15%2 != 0,但是15 % 3 == 0
//但是,按照这个逻辑的话,15就是质数,显然这是不成立的
{
System.out.println(i + "是质数");
count++;
break;
}
}
}
System.out.println("100以内的质数的总个数为" + count);
//System.out.println("Hello World!");
}
}
使用标志位的方式来改正该代码,具体如下所示:
//下面程序运行的结果是:
/*
2是质数,当i等于2的时候,程序不会进入内层循环
3是质数
100以内的质数的总个数为2
但是,5明显也是质数,于是,此代码有问题
*/
class PrimeNumberTest
{
public static void main(String[] args)
{
int count = 0;
boolean isFlag = true;
for (int i = 2; i <= 100; i++)
{
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
//System.out.println(i + "不是质数");
isFlag = false;
}
}
if (isFlag == true)
{
System.out.println(i + "是质数");
count++;
}
}
System.out.println("100以内的质数的总个数为" + count);
//System.out.println("Hello World!");
}
}
进一步来修改代码(正确的代码)
class PrimeNumberTest
{
public static void main(String[] args)
{
int count = 0;
boolean isFlag = true;
for (int i = 2; i <= 100; i++)
{
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
//System.out.println(i + "不是质数");
isFlag = false;
//isFlag = true; 肯定是不能在这里重置isFlag的值的
/*这个地方的if语句,其实就是判断在遍历的过程中,有没有进去
这个里面去,进而判断是不是质数的问题*/
}
}
if (isFlag == true)
{
System.out.println(i + "是质数");
count++;
}
isFlag = true; //注意要在这里重置isFlag的值
}
System.out.println("100以内的质数的总个数为" + count);
//System.out.println("Hello World!");
}
}
下面这个自动重置isFlag的代码,是直接在每次外层循环的时候进行重置的,但是实际上它是重新给一个变量开辟了新的空间,但是第一种的重置isFlag是没有重新给isFlag开辟内存空间的,只是每次修改了isFlag的值,具体代码如下
class PrimeNumberTest
{
public static void main(String[] args)
{
int count = 0;
for (int i = 2; i <= 100; i++)
{
boolean isFlag = true; //相当于,每进行一次外层的循环,就重新给isFlag开辟新
//的内存空间,并进行赋值操作
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
//System.out.println(i + "不是质数");
isFlag = false;
//isFlag = true; 肯定是不能在这里重置isFlag的值的
/*这个地方的if语句,其实就是判断在遍历的过程中,有没有进去
这个里面去,进而判断是不是质数的问题*/
}
}
if (isFlag == true)
{
System.out.println(i + "是质数");
count++;
}
// isFlag = true; //注意要在这里重置isFlag的值
}
System.out.println("100以内的质数的总个数为" + count);
//System.out.println("Hello World!");
}
}
优化代码1:加break
class PrimeNumberTest1
{
public static void main(String[] args)
{
int count = 0;
//获取当前时间距离1970年1月1日午夜之间的时间差(以毫秒为单位进行测量)
long start = System.currentTimeMillis();
for (int i = 2; i <= 100000; i++)
{
boolean isFlag = true; //相当于,每进行一次外层的循环,就重新给isFlag开辟新
//的内存空间,并进行赋值操作
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
//System.out.println(i + "不是质数");
isFlag = false;
break; //优化代码一:这个地方优化,只是相对于该数本身是非质数的数字有效
//isFlag = true; 肯定是不能在这里重置isFlag的值的
/*这个地方的if语句,其实就是判断在遍历的过程中,有没有进去
这个里面去,进而判断是不是质数的问题*/
}
}
if (isFlag == true)
{
System.out.println(i + "是质数");
count++;
}
// isFlag = true; //注意要在这里重置isFlag的值
}
System.out.println("100以内的质数的总个数为" + count);
//System.out.println("Hello World!");
//获取当前时间距离1970年1月1日午夜之间的时间差(以毫秒为单位进行测量)
long end = System.currentTimeMillis();
System.out.println("所花费的时间为: " + (end - start));
}
}
优化代码2
/*
题目:100以内所有质数的输出:
优化代码二:
j <= Math.sqrt(i);这主意这个地方就要取等号了,否则会露东西
比如:我们选取的数字是64,8 * 8 =64,很显然,此时我们就要考虑等号的问题了
*/
class PrimeNumberTest1
{
public static void main(String[] args)
{
int count = 0;
//获取当前时间距离1970年1月1日午夜之间的时间差(以毫秒为单位进行测量)
long start = System.currentTimeMillis();
for (int i = 2; i <= 100000; i++)
{
boolean isFlag = true; //相当于,每进行一次外层的循环,就重新给isFlag开辟新
//的内存空间,并进行赋值操作
for (int j = 2; j <= Math.sqrt(i); j++)
{ //优化二:j <= Math.sqrt(i); 对本身是自然数的数字有效
//想想为什么可以取Math.sqrt(i)来优化代码
if (i % j == 0)
{
//System.out.println(i + "不是质数");
isFlag = false;
break; //优化代码一:这个地方优化,只是相对于该数本身是非质数的数字有效
//isFlag = true; 肯定是不能在这里重置isFlag的值的
/*这个地方的if语句,其实就是判断在遍历的过程中,有没有进去
这个里面去,进而判断是不是质数的问题*/
}
}
if (isFlag == true)
{
System.out.println(i + "是质数");
count++;
}
// isFlag = true; //注意要在这里重置isFlag的值
}
System.out.println("100以内的质数的总个数为" + count);
//System.out.println("Hello World!");
//获取当前时间距离1970年1月1日午夜之间的时间差(以毫秒为单位进行测量)
long end = System.currentTimeMillis();
System.out.println("所花费的时间为: " + (end - start));
}
}