猜生日问题:
小明对生日十分看重,因为他可以得到祝福,可以和朋友亲人一起分享快乐,可以为自己的人生做一次总结,并且...能够收到好多礼物! 不过小明是个神秘的人,不会轻易告诉你他的生日,现在他想到一个办法,让你去猜他的生日是哪一天。 小明会告诉你如下三个信息: 1. 出生月份和出生日子的最大公约数; 2. 出生月份和出生日子的最小公倍数; 3. 出生年份; 现在要求你猜出小明的生日。
Input
第一行输入一个正整数T,表示总共有T组册数数据(T <= 200); 对于每组数据依次输入三个数x,y,z, x表示出生月份和出生日子的最大公约数(1<= x <=1000); y表示出生月份和出生日子的最小公倍数(1<= y <=1000); z表示出生年份(1900 <= z <= 2013)。 每组输入数据占一行。
Output
对于每组数据,先输出Case数。 如果答案不存在 ,输出“-1”; 如果答案存在但不唯一 ,输出“1”; 如果答案唯一,输出生日,日期格式为YYYY/MM/DD;
package main
import (
"fmt"
)
/*检查如期是否合法*/
func checkDate(y, m, d int) int {
var arr [13]int = [13]int{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
//闰年
if (y%4 == 0 && y%100 != 0) || y%400 == 0 {
arr[2] = 29
}
if arr[m] < d {
return 0
}
return 1
}
/*
*已知x和y的最小公倍数min和最大公约数max,求x和y
*由最小公倍数性质:min=x*y/max,所以x*y=max*min
*由最大公约数性质:x和y都可以写成max*n
*/
func rgcd(min, max, y int, m, d *int) int {
var mMax, dMax, res, count, tmp int = 12 / max, 31 / max, min * max, 0, 0
for i := 1; i <= mMax; i++ {
for j := 1; j <= dMax; j++ {
tmp = max * i * max * j
if tmp > res {
break
} else if tmp == res {
//计算得到的日期的合法,才加上
tmpM := max * i
tmpD := max * j
if checkDate(y, tmpM, tmpD) == 1 {
*m = tmpM
*d = tmpD
//fmt.Println(*m, *d)
count++
}
}
}
}
if count > 1 {
return 1
} else if count == 1 {
return 0
} else {
return -1
}
}
func main() {
min, max, y, m, d := 24, 3, 1999, 0, 0
fr := rgcd(min, max, y, &m, &d)
if fr == 0 {
fmt.Printf("%d/%02d/%02d", y, m, d)
} else {
fmt.Println(fr)
}
}