题目描述
有两个闹钟。
第一个闹钟会在 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
思路一:
刚开始想的是哈希表
但是最后一个点TLE了,于是又去想想,发现是个数学问题;
之后敲代码hhh
转码,有的累,需要的私聊
时间复杂度 O(n^2)
参考文献
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int a,b,c,d;
int main()
{
cin>>a>>b>>c>>d;
for (int i = 0; i < 100; i ++ )
{
for (int j = 0; j < 100; j ++ )
{
if(i*a-j*c==d-b)
{
cout<<i*a+b<<'\n';
return 0;
}
}
}
cout<<"-1"<<'\n';
return 0;
}
//这样也行
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int a, b, c, d;
cin >> a >> b >> c >> d;
for (int i = max(b, d); i <= 10100; i ++ )
if ((i - b) % a == 0 && (i - d) % c == 0)
{
cout << i << endl;
return 0;
}
puts("-1");
return 0;
}
Java代码
import java.util.*;
import java.io.*;
public class Main{
static int a,b,c,d;
public static void main(String[] args) {
Scanner cin =new Scanner(System.in);
a=cin.nextInt();
b=cin.nextInt();
c=cin.nextInt();
d=cin.nextInt();
for (int i = 0; i < 100; i ++ )
{
for (int j = 0; j < 100; j ++ )
{
if(i*a-j*c==d-b)
{
System.out.println(i*a+b);
return ;
}
}
}
System.out.println("-1");
return ;
}
}
Python3代码
a, b = map(int, input().split())
c, d = map(int, input().split())
f = False
ans = 10000000000
for i in range(200):
for j in range(200):
if b + i * a == d + j * c:
if ans > d + j * c: ans = d + j * c
if ans == 10000000000 : print("-1")
else : print(ans)
GO 代码
package main
import (
"bufio"
. "fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var a, b, c, d int
Fscan(in, &a, &b, &c, &d)
for i := 0; i <= 1000; i++ {
for j := 0; j <= 1000; j++ {
if i*a - j*c == d - b {
Fprintln(out, b+i*a)
return
}
}
}
Fprintln(out, -1)
}
欢迎留言点赞