HDOJ 4551 小明生日
来源:互联网 发布:linux telnet远程登录 编辑:程序博客网 时间:2024/05/08 16:22
题目描述:
Problem Description
小明对生日十分看重,因为他可以得到祝福,可以和朋友亲人一起分享快乐,可以为自己的人生做一次总结,并且...能够收到好多礼物!
不过小明是个神秘的人,不会轻易告诉你他的生日,现在他想到一个办法,让你去猜他的生日是哪一天。
小明会告诉你如下三个信息:
1. 出生月份和出生日子的最大公约数;
2. 出生月份和出生日子的最小公倍数;
3. 出生年份;
现在要求你猜出小明的生日。
不过小明是个神秘的人,不会轻易告诉你他的生日,现在他想到一个办法,让你去猜他的生日是哪一天。
小明会告诉你如下三个信息:
1. 出生月份和出生日子的最大公约数;
2. 出生月份和出生日子的最小公倍数;
3. 出生年份;
现在要求你猜出小明的生日。
Input
第一行输入一个正整数T,表示总共有T组册数数据(T <= 200);
对于每组数据依次输入三个数x,y,z,
x表示出生月份和出生日子的最大公约数(1<= x <=1000);
y表示出生月份和出生日子的最小公倍数(1<= y <=1000);
z表示出生年份(1900 <= z <= 2013)。
每组输入数据占一行。
对于每组数据依次输入三个数x,y,z,
x表示出生月份和出生日子的最大公约数(1<= x <=1000);
y表示出生月份和出生日子的最小公倍数(1<= y <=1000);
z表示出生年份(1900 <= z <= 2013)。
每组输入数据占一行。
Output
对于每组数据,先输出Case数。
如果答案不存在 ,输出“-1”;
如果答案存在但不唯一 ,输出“1”;
如果答案唯一,输出生日,日期格式为YYYY/MM/DD;
每组输出占一行,具体输出格式参见样例。
如果答案不存在 ,输出“-1”;
如果答案存在但不唯一 ,输出“1”;
如果答案唯一,输出生日,日期格式为YYYY/MM/DD;
每组输出占一行,具体输出格式参见样例。
Sample Input
312 24 19923 70 19999 18 1999
Sample Output
Case #1: 1992/12/24Case #2: -1Case #3: 1999/09/18
第一次AC:
#include <iostream>int bignum(int m, int n);bool IsRun(int yea);int main(){ using namespace std; int T; cin >> T; for(int i = 1; i <= T; ++i) { int x, y, z; cin >> x >> y >> z; int k = 0; int day, mon, year = z; int month[12] = {30,28,31,30,31,30,31,31,30,31,30,31}; for(int j = 1; j <= 12; ++j) { if(j == 2 && IsRun(z)) month[1] = 29; for(int r = 1; r <= month[j-1]; ++r )//暴力求解 { if(x == bignum(j, r) && y == j*r/x) { mon = j; day = r; ++k; } } } if(k == 0) cout << "Case #" << i << ": -1" << endl; else if(k > 1) cout << "Case #" << i << ": 1" << endl; else if(k == 1) { cout << "Case #" << i << ": " << year << "/"; cout.fill('0'); cout.width(2); cout << mon << "/"; cout.width(2); cout << day << endl; } } return 0;}int bignum(int m, int n){ if(m == 1 || n == 1) return 1; while(n) { int temp = n; n = m%n; m = temp; } return m;}bool IsRun(int yea){ if((yea%4 == 0 && yea%100 != 0 )||yea%400 == 0) return true; else return false;}
第二次改进:
#include <iostream>int bignum(int m, int n);bool IsRun(int yea);bool test(int a, int b, int c);int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; // 一月31搞错了,囧int main(){ using namespace std; int T; cin >> T; for(int i = 1; i <= T; ++i) { int x, y, z; cin >> x >> y >> z; int k = 0; int day, mon, year = z; if(y%x == 0) { int s = y/x; for(int j = 1; j <= s; ++j) // 循环到sqrt(s)交换判定有问题,除数和商相同对后续test不方便!! { if(s%j == 0 && bignum(j,s/j)==1) // 不是相互不能除尽!是互质!! { if(test(y/j,j*x,z)) { day = y/j; mon = j*x; ++k; } } if(k > 1) break; } } if(k == 0) cout << "Case #" << i << ": -1" << endl; else if(k > 1) cout << "Case #" << i << ": 1" << endl; else if(k == 1) { cout << "Case #" << i << ": " << year << "/"; cout.fill('0'); cout.width(2); cout << mon << "/"; cout.width(2); cout << day << endl; } } return 0;}int bignum(int m, int n){ if(m == 1 || n == 1) return 1; while(n) { int temp = n; n = m%n; m = temp; } return m;}bool IsRun(int yea){ if((yea%4 == 0 && yea%100 != 0 )||yea%400 == 0) return true; else return false;}bool test(int a, int b, int c){ if(b <= 12) { if(b==2 && IsRun(c)) month[1]=29; else month[1]=28; if(a <= month[b-1]) return true; } return false;}
- HDOJ 4551 小明生日
- hdoj 4551 生日猜猜猜
- [HDOJ 4551] 生日猜猜猜
- hdoj zb的生日
- 逻辑题:小明妈妈的生日
- 小明和小强推理老师的生日
- 【HDOJ】1201 -> 18岁生日
- HDOJ 1201 18岁生日
- 18岁生日 hdoj 1201
- hdoj 1201 18岁生日
- HDOJ 1201 18岁生日
- HDOJ 1201 18岁生日
- HDOJ-1201 18岁生日
- HDOJ 1201 18岁生日
- HDOJ 1201 18岁生日
- HDOJ 1201-18岁生日
- HDOJ 1201 18岁生日
- HDOJ 1201 18岁生日
- MFC--图片控件Picture Control
- 每日学习总结:"已有打开的与此命令相关联的 DataReader,必须首先将它关闭。"、Sql Server 连接池机制
- 服务程序性能优化之另辟蹊径
- JFreechart 制作柱状图、饼图、折线图、仪表图等统计图的使用方法
- 简单登录页面使用验证码
- HDOJ 4551 小明生日
- 黑马程序员之缓冲区
- AndroidUsbCamera 编译问题
- JSON 入门指南
- QTextEdit捕捉回车信号
- eigen 初探
- 多线程 创建线程的两种方式
- 如何计算结构体大小
- 将移植好的linux通过tftp下载到开发板后,一直循环powered down,不能进行操作。