JAVA|第一届AcWing Cup决赛两个闹钟问题

//有两个闹钟。 //第一个闹钟会在 b,b+a,b+2a,b+3a,… 时刻响铃。 //第二个闹钟会在 d,d+c,d+2c,d+3c,… 时刻响铃。 //请计算两个闹钟第一次同时响铃的具体时刻。 //输入格式 //第一行包含两个整数 a,b。 //第二行包含两个整数 c,d。 //输出格式 //一个整数,表示第一次同时响铃的具体时刻。 //如果永远都不可能同时响铃,则输出 ?1。 //数据范围 //所有测试点满足 1≤a,b,c,d≤100。 //输入样例1: //20 2 //9 19 //输出样例1: //82 //输入样例2: //2 1 //16 12 //输出样例2: //-1 import java.util.Scanner; public class 闹钟 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int sum=0; //定义一个类似于标记的数 int a=sc.nextInt(); int b=sc.nextInt(); int c=sc.nextInt(); int d=sc.nextInt(); //输入四个时间 long arr[]=new long[101]; long arr2[]=new long[101]; for (int i = 0; i <=100; i++) { //根据题目 arr[i]=(a*i)+b; //第一个闹钟会在 b,b+a,b+2a,b+3a,… 时刻响铃。 arr2[i]=(c*i)+d; //第二个闹钟会在 d,d+c,d+2c,d+3c,… 时刻响铃。 //将两个闹钟的响铃时刻存入数组 } for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) { //遍历数组,如果两个闹钟的响铃时间相同则输出这个时间,并结束遍历 if(arr[i]==arr2[j]){ sum++; //标记加1,方便观察是否有相同的响铃时刻 System.out.println(arr[i]); return; //结束 } } } if(sum==0){ System.out.println(-1); //如果永远都不可能同时响铃,则输出 ?1。 } } }

第二种解法:
import java.util.Scanner; class Main{ public static void main(String[] args) { Scanner sc=new Scanner(System.in); int a=sc.nextInt(); int b=sc.nextInt(); int c=sc.nextInt(); int d=sc.nextInt(); int n=Math.max(b,d); for(int i=n; i<=10100; i++){//因为所有测试点满足 1≤a,b,c,d≤100。所以为100*100,然后加上减去的数在100以内,即为10100 //响铃时刻(t)=b+xa(x为倍数),所以(t-b)%xa=0 if((i-b)%a==0 && (i-d)%c==0){//如果第一个和第二个闹钟的响铃时刻相同则输出这个时间 System.out.println(i); return; //结束 } } System.out.println(-1); //如果永远都不可能同时响铃,则输出 ?1。 } }

【JAVA|第一届AcWing Cup决赛两个闹钟问题】

    推荐阅读