前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 语言实现 猜生日问题

Go 语言实现 猜生日问题

作者头像
李海彬
发布2018-03-19 17:21:32
7720
发布2018-03-19 17:21:32
举报
文章被收录于专栏:Golang语言社区Golang语言社区

猜生日问题:

小明对生日十分看重,因为他可以得到祝福,可以和朋友亲人一起分享快乐,可以为自己的人生做一次总结,并且...能够收到好多礼物! 不过小明是个神秘的人,不会轻易告诉你他的生日,现在他想到一个办法,让你去猜他的生日是哪一天。 小明会告诉你如下三个信息: 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)

}

}

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档