【PAT 乙级(Basic Level)】数字分类

本文探讨了两种不同的Java程序实现方式,一种使用多个if语句进行条件判断,另一种采用switch语句进行优化。通过对比发现,合理使用switch并添加default分支可以有效提升程序效率。

呃,感觉代码太长了,但是暂时还没找到更好的办法。尤其是flag标志位,总觉得太多了,应该有更好的办法,暂时没思路。

方法一:

直接判断。


import java.text.DecimalFormat;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		if (n <= 1000) {
			int index, a1, a2, count1, count2, temp, count3;
			boolean flag1, flag2, flag3, flag4, flag5;
			flag1 = flag2 = flag3 = flag4 = flag5 = false;
			double a4 = 0.0;
			index = a1 = a2 = count1 = count2 = count3 = temp = 0;
			DecimalFormat df = new DecimalFormat("#.0");
			int[] number = new int[n];
			for (index = 0; index < n; index++) {
				int b = sc.nextInt();
				if (b > 1000) {
					return;
				} else {
					number[index] = b;
					if (number[index] % 5 == 0 & number[index] % 2 == 0) {
						a1 += number[index];
						flag1 = true;
					}
					if (number[index] % 5 == 1) {
						if (count3 % 2 == 0) {
							a2 += number[index];
						} else {
							a2 -= number[index];
						}
						flag2 = true;
						count3++;
					}
					if (number[index] % 5 == 2) {
						count1++;
						flag3 = true;
					}
					if (number[index] % 5 == 3) {
						a4 += number[index];
						count2++;
						flag4 = true;
					}
					if (number[index] % 5 == 4) {
						if (temp < number[index]) {
							temp = number[index];
							flag5 = true;
						}
					}
				}
			}
			if (flag1) {
				System.out.print(a1);
			} else {
				System.out.print("N");
			}
			if (flag2) {
				System.out.print(" " + a2);
			} else {
				System.out.print(" N");
			}
			if (flag3) {
				System.out.print(" " + count1);
			} else {
				System.out.print(" N");
			}
			if (flag4) {
				System.out.print(" " + df.format(a4 / count2));
			} else {
				System.out.print(" N");
			}
			if (flag5) {
				System.out.print(" " + temp);
			} else {
				System.out.print(" N");
			}
		}
	}
}

方法二:

用switch判断。


import java.text.DecimalFormat;
import java.util.Scanner;
public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    if (n <= 1000) {
      int index, a1, a2, count1, count2, temp, count3;
      index = a1 = a2 = count1 = count2 = count3 = temp = 0;
      boolean flag1, flag2, flag3, flag4, flag5;
      flag1 = flag2 = flag3 = flag4 = flag5 = false;
      double a4 = 0.0;
      DecimalFormat df = new DecimalFormat("#.0");
      int[] number = new int[n];
      for (index = 0; index < n; index++) {
        int b = sc.nextInt();
        if (b > 1000) {
          return;
        } else {
          number[index] = b;
          int m = number[index] % 5;
          switch (m) {
          case 0:
            if (number[index] % 2 == 0) {
              a1 += number[index];
              flag1 = true;
            }
            break;
          case 1:
            if (count3 % 2 == 0) {
              a2 += number[index];
            } else {
              a2 -= number[index];
            }
            flag2 = true;
            count3++;
            break;
          case 2:
            count1++;
            flag3 = true;
            break;
          case 3:
            a4 += number[index];
            count2++;
            flag4 = true;
            break;
          case 4:
            if (temp < number[index]) {
              temp = number[index];
              flag5 = true;
            }
            break;
          }
        }
      }
      if (flag1) {
        System.out.print(a1);
      } else {
        System.out.print("N");
      }
      if (flag2) {
        System.out.print(" " + a2);
      } else {
        System.out.print(" N");
      }
      if (flag3) {
        System.out.print(" " + count1);
      } else {
        System.out.print(" N");
      }
      if (flag4) {
        System.out.print(" " + df.format(a4 / count2));
      } else {
        System.out.print(" N");
      }
      if (flag5) {
        System.out.print(" " + temp);
      } else {
        System.out.print(" N");
      }
    }
  }
}


遗问:我还没研究为什么方法二反而比方法一费时。理论上方法一是对每一个数字做5次判断,方法二则是只做一次判断,即判断m,为什么判断次数变少了,时长反而增加了。


更新:

我发现方法二中自己漏了default,加了以后效率就变高了,果然方法二比方法一效率要高。



import java.text.DecimalFormat;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        if (n <= 1000) {
            int index, a1, a2, count1, count2, temp, count3;
            index = a1 = a2 = count1 = count2 = count3 = temp = 0;
            boolean flag1, flag2, flag3, flag4, flag5;
            flag1 = flag2 = flag3 = flag4 = flag5 = false;
            double a4 = 0.0;
            DecimalFormat df = new DecimalFormat("#.0");
            int[] number = new int[n];
            for (index = 0; index < n; index++) {
                int b = sc.nextInt();
                if (b > 1000) {
                    return;
                } else {
                    number[index] = b;
                    int m = number[index] % 5;
                    switch (m) {
                    case 0:
                        if (number[index] % 2 == 0) {
                            a1 += number[index];
                            flag1 = true;
                        }
                        break;
                    case 1:
                        if (count3 % 2 == 0) {
                            a2 += number[index];
                        } else {
                            a2 -= number[index];
                        }
                        flag2 = true;
                        count3++;
                        break;
                    case 2:
                        count1++;
                        flag3 = true;
                        break;
                    case 3:
                        a4 += number[index];
                        count2++;
                        flag4 = true;
                        break;
                    case 4:
                        if (temp < number[index]) {
                            temp = number[index];
                            flag5 = true;
                        }
                        break;
                    default:
                        break;
                    }
                }
            }
            if (flag1) {
                System.out.print(a1);
            } else {
                System.out.print("N");
            }
            if (flag2) {
                System.out.print(" " + a2);
            } else {
                System.out.print(" N");
            }
            if (flag3) {
                System.out.print(" " + count1);
            } else {
                System.out.print(" N");
            }
            if (flag4) {
                System.out.print(" " + df.format(a4 / count2));
            } else {
                System.out.print(" N");
            }
            if (flag5) {
                System.out.print(" " + temp);
            } else {
                System.out.print(" N");
            }
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值