我使用的算法比较简单,就是循环,当出现(day-p) % 23 == 0 && (day-e) % 28 == 0 && (day-i) % 33 ==0表示当天是三个周期的高峰。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin=new Scanner(System.in); int idx = 0; while(true){ int p = cin.nextInt(); int e = cin.nextInt(); int i = cin.nextInt(); int d = cin.nextInt(); if(p == -1 && e == -1 && i==-1 && d==-1){ break; } idx++; System.out.println("Case "+idx+": the next triple peak occurs in "+ getNextPeakDay(p, e, i, d)+" days."); } } private static int getNextPeakDay(int p, int e, int i, int d){ int day = d; while(true){ day++; if((day-p) % 23 == 0 && (day-e) % 28 == 0 && (day-i) % 33 ==0){ break; } } return day-d; } }
网上有另外一种解法,效率比较高,暂时没想出是怎么推导出的。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int k = 0; while (scan.hasNext()) { int p = scan.nextInt(); int e = scan.nextInt(); int i = scan.nextInt(); int d = scan.nextInt(); if (p == -1 && e == -1 && i == -1 && d == -1) { break; } k++; int days = (5544 * p + 14421 * e + 1288 * i - d) % (21252); if (days <= 0) { days = 23 * 28 * 33 + days; } System.out.println("Case " + k + ": the next triple peak occurs in " + days + " days."); } } }