题目: 小明从2006年1月1日开始,每三天结识一个美女两天结识一个帅哥,编程实现当输入2006年1月1日之后的任意一天,输出小明那天是结识美女还是帅哥(注意润年问题) 核心思想: 1.求出输入日期在当年是第几天 2.计算出之前经历过几个闰年 3.计算出从开始日期至输入日期的总天数 4.利用取余运算判断题目要求 - #include <stdio.h>
- /* 判断该年是否是闰年 */
- int whichYear(int year)
- {
- if((year%4==0 && year%100!=0) || year%400==0)
- return 1;
- else
- return 0;
- }
- /* 计算日期为当年的第几天 */
- int whichDay(int day, int month, int leapYear)
- {
- int days[2][13] =
- {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, //平年每月天数
- 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //闰年每月天数
-
- /* 判断日期输入是否正确 */
- if (month < 1 || month > 12)
- {
- printf("日期输入错误!\n");
- return 0;
- }
-
- if (day > days[leapYear][month] || day < 1)
- {
- printf("日期输入错误!\n");
- return 0;
- }
-
- /* 总天数 = 当月日期 + 之前月天数总和 */
- for (int i = 0; i < month; i++)
- day += days[leapYear][i];
- return day;
- }
- /* 计算出总天数,并作出判断 */
- int countDay(int day, int month, int year)
- {
- int countLeap = 0; //闰年计数
- int sumDay = 0; //总天数
- int fristDay = whichDay(1,1,whichYear(2006)); //2006年1月1日为当年第几天
-
- if ( !(sumDay = whichDay(day,month,whichYear(year)))) //验证输入日期是否正确
- return 1;
-
- //计算出过了多少个闰年
- for(int i = 2006; i < year; i++)
- {
- if (whichYear(i))
- countLeap++;
- }
-
- sumDay += 365*(year - 2006) + countLeap - fristDay + 1; //计算总天数
- printf("从2006年1月1日至此共经历%d天\n",sumDay);
- //每3天认识美女
- if(sumDay % 3 == 0)
- printf("小明认识美女\n");
- //每2天认识帅哥
- if(sumDay % 2 == 0)
- printf("小明认识帅哥\n");
- //其余天数自己玩
- if(sumDay % 2 != 0 && sumDay % 3 != 0)
- printf("小明自己玩\n");
- return 0;
- }
- int main()
- {
- int day = 0, month = 0, year = 0; // 日 月 年
- int flag = 1;
- while (flag) {
- printf("请输入日期(month/day/year):\n");
- scanf("%d/%d/%d", &month, &day, &year);
- if (year < 2006)
- {
- printf("日期输入错误!\n");
- continue;
- }
- flag = countDay(day, month, year);
- }
-
- return 0;
- }
复制代码
|