A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

小明从2006年1月1日开始,每三天结识一个美女两天结识一个帅哥,编程实现当输入2006年1月1日之后的任意一天,输出小明那天是结识美女还是帅哥(注意润年问题)


#include<stdio.h>




int year_sumday(int y)
{
    int year_day;//按年算天数,但不包括当前年天数,当前年天数由月天数和日天数计算出
   
   
    if(y-2006>2)//从2008年才出现第一个润年
    {
        year_day = (y-2008)*365+(y-2008)/4;//按每年36天再加润年天数
    }
    else year_day = (y-2006)*365;
   
    return year_day;
}

int month_sumday(int m)//第一个参数为年,第二个参数为月
{
    int month_day = 0;////按月算天数
    int mon[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//每月天数
    int i = 0;
   
   
    for (i=0; i<m-1; i++) //计算月天数
        {
        month_day = month_day+mon;
    }
   
    if(m>2)month_day=month_day+1;//计算当前日期时候包含润日
   
    return month_day;
}


int main()
{
    int year;//
    int month;//
    int day;//
    int sumday = 0;//
   
    printf("请输入当前年份:");
    scanf("%d",&year);
    printf("请输入当前月份:");
    scanf("%d",&month);
    printf("请输入当前日期:");
    scanf("%d",&day);
   
    int year_day = year_sumday(year);//年天数
    int month_day =month_sumday(month);//月天数
   
    sumday = year_day+month_day+day;//总天数
   
    if(sumday%3 ==0)
        {
                if(sumday%2 ==0)printf("这一天既认识了美女又认识了帅哥\n");
                else printf("这一天只认识了美女\n");
        }
    else if(sumday%2 ==0)printf("这一天只认识了帅哥\n");
    else printf("这一天既没认识美女也没认识\n");
   
    return 0;
   
}

本帖被以下淘专辑推荐:

49 个回复

倒序浏览
本帖最后由 lcx 于 2015-5-4 21:09 编辑

基本思路正确,但是有一个重要细节被忽略了,那就是输入的当年是不参与年份计算的,如2008年,这个2007可以转换为365,但是2008是不能转换的,他的值根据月份和日期来算。同理2008 8中的8月份也不参加月份转换的计算。他的值来自天数。

/*
  假设:
        1、普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)
        2、世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
        将年月日转换成整数,用输入的整数余上6、3、2得出结果。
  */

    #include<stdio.h>
    //程序入口main函数
    int main()
    {
        int sum=0;
        printf("请输入年月日,用空格分隔他们");
        int year=0;
        int moon=0;
        int day=0;
        scanf("%d %d %d",&year,&moon,&day);
        if(year<2006||moon<=0&&moon>12||day<=0&&day>31)
        {
                printf("输入有误,请检查格式是否正确输入,年份需大于等于2006,月份需大于1小于等于12,天数需大于等于1小于等于31\n");
                return 0;
        }
        //将年份转换为天数
        for(int i=2006;i<year;i++)
        {
                if(i%4==0&&i%100!=0||i%400==0)
                {
                        sum+=366;
                }
                else
                {
                        sum+=365;
                }
        }
        //将月份转换为天数
        for(int i=1;i<moon;i++)
        {
                swich(i)
                {
                        case 1:sum+=31;
                        break;
                        case 2:
                                if(year%4==0&&year%100!=0||year%400==0)
                                        sum+=29;
                                else
                                        sum+=28;
                                break;
                        case 3:sum+=31;
                        break;
                        case 4:sum+=30;
                        break;
                        case 5:sum+=31;
                        break;
                        case 6:sum+=30;
                        break;
                        case 7:sum+=31;
                        break;
                        case 8:sum+=31;
                        break;
                        case 9:sum+=30;
                        break;
                        case 10:sum+=31;
                        break;
                        case 11:sum+=30;
                }
        }
        //将天数加上天数
        sum+=day;
        //将整数余上6、3、2
        if(sum%6==0)
        {
                printf("结识了帅哥和美女");
        }
        else if(sum%3==0)
        {
                printf("结识了美女");
        }
        else if(sum%2==0)
        {
                printf("结识了帅哥");
        }
        else
        {
                printf("没有结交朋友");
        }
        return 0;
    }
给善于提问和热心解答的人一人两技术分吧
回复 使用道具 举报
lcx 发表于 2015-5-4 21:05
基本思路正确,但是有一个重要细节被忽略了,那就是输入的当年是不参与年份计算的,如2008年,这个2007可以 ...

十分感谢
回复 使用道具 举报
牛牛牛  我正在看视频阶段。。。
回复 使用道具 举报
楼主程序的闰年判断天数,好像有些不对吧。
比如我输入年份为2009,你year_day返回的天数是365这显然不对嘛。
从08年起(不包括08年)每隔四年多加一天
楼主可以递推找下规律。我找的规律如下
if(y-2006>2)//从2009年开始
    {
        //按每年365天再加润年天数,递推规律得出
         year_day = (y-2006)*365+1+(y-2009)/4;
    }
    else year_day = (y-2006)*365;
回复 使用道具 举报
另外 你的月份天数判断闰月if(m>2)month_day=month_day+1;//计算当前日期时候包含润日
回复 使用道具 举报
另外 你的月份天数month_sumday()是无法判断是否闰月,要根据输入的年份才可作出判断。
回复 使用道具 举报
mony 中级黑马 2015-5-7 20:36:35
8#
  1. #import <Foundation/Foundation.h>
  2. #define baseYear 2006       // 定义基础年,可以方便修改

  3. int nomailDay[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
  4. int BissextileDay[12] = {31,29,31,30,31,30,31,31,30,31,30,31};

  5. bool isBissextile(int year);

  6. int totalDaysInYear(int year,int month,int day);

  7. void findFriends(int days);

  8. // 主函数
  9. int main(int argc, const char * argv[]) {

  10.     int year = 0;
  11.     int month = 0;
  12.     int day = 0;
  13.    
  14.     while (year < baseYear || month < 1 || month >12 || day < 1) {
  15.         printf("请输入年-月-日,如:2015-4-22\n");
  16.         scanf("%d-%d-%d",&year,&month,&day);
  17.         
  18.         if ((isBissextile(year) && day > BissextileDay[month-1]) || (!isBissextile(year) && day >nomailDay[month-1])) {
  19.             year = month = day = 0;
  20.         }
  21.     }
  22.     printf("这天为%d年%d月%d日。\n",year,month,day);
  23.     findFriends(totalDaysInYear(year, month, day));
  24.    
  25.     return 0;
  26. }

  27. bool isBissextile(int year) {
  28.     if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
  29.         return true;
  30.     }
  31.     else {
  32.         return false;
  33.     }
  34. }

  35. int totalDaysInYear(int year,int month,int day){
  36.     int totalDays = 0;
  37.    
  38.     if (isBissextile(year)) {
  39.         for (int i = 0; i < month - 1; i++) {
  40.             totalDays += BissextileDay[i];
  41.         }
  42.     }
  43.     else {
  44.         for (int i = 0; i < month - 1; i++) {
  45.             totalDays += nomailDay[i];
  46.         }
  47.     }
  48.     totalDays += day;

  49.     for (int i = baseYear; i < year; i++) {
  50.         
  51.         if (isBissextile(i)) {
  52.             totalDays += 366;
  53.         }
  54.         else {
  55.             totalDays += 365;
  56.         }
  57.     }

  58.     printf("这天是从2006年1月1日开始的第%d天。\n",totalDays);

  59.     return totalDays;
  60. }

  61. void findFriends(int days){

  62.     if (days % 6 == 0) {
  63.         printf("小明这天同时结识美女和帅哥。\n");
  64.     }
  65.     else if (days % 2 == 0){
  66.         printf("小明这天结识的是帅哥。\n");
  67.     }
  68.     else if (days % 3 == 0){
  69.         printf("小明这天结识的是美女。\n");
  70.     }
  71.     else{
  72.         printf("小明这天没有结识帅哥和美女。\n");
  73.     }
  74. }
复制代码

放上我的代码,供楼主参考。

回复 使用道具 举报 1 0
学习学习!
回复 使用道具 举报
只要作对了就能得分
回复 使用道具 举报
这不就是三天打鱼两天晒网么. 出题都这么新潮了.
还有5天一循环, 如果是平年, 一整年就不用算了. 只要算出多余的天数不就好了
回复 使用道具 举报
cui0wei0 发表于 2015-5-7 23:59
这不就是三天打鱼两天晒网么. 出题都这么新潮了.
还有5天一循环, 如果是平年, 一整年就不用算了. 只要算出 ...

打鱼和晒网冲突,只能干一件。交友可就不是5天一循环了
回复 使用道具 举报
学习学习!
回复 使用道具 举报
wx_BZhrvVik 发表于 2015-5-8 13:12
打鱼和晒网冲突,只能干一件。交友可就不是5天一循环了

那就有歧义了,是三天找个女的,并且两天找个男的了?那第一天是放假还是找女的还是找男的?还是第一天两个都找然后隔两天找个女的,隔一天找个男的?
既然目的不明确,最好先搞清别人到底想让你干嘛. 不然工作了也是受累不讨好
回复 使用道具 举报
我叫顺子 来自手机 中级黑马 2015-5-8 22:44:09
15#
好复杂啊。
回复 使用道具 举报
逆流瞅瞅 发表于 2015-5-7 16:26
楼主程序的闰年判断天数,好像有些不对吧。
比如我输入年份为2009,你year_day返回的天数是365这显然不对嘛 ...

好像是有些问题
回复 使用道具 举报
逆流瞅瞅 发表于 2015-5-7 16:29
另外 你的月份天数month_sumday()是无法判断是否闰月,要根据输入的年份才可作出判断。 ...

十分感谢
回复 使用道具 举报
cui0wei0 发表于 2015-5-8 22:34
那就有歧义了,是三天找个女的,并且两天找个男的了?那第一天是放假还是找女的还是找男的?还是第一天两个都 ...

嗯,是啊
回复 使用道具 举报
6666666!已经很好了
回复 使用道具 举报
本帖最后由 cui0wei0 于 2015-5-10 22:30 编辑
lcx 发表于 2015-5-10 19:30
最喜欢抽水货和键盘选手的脸,3005年1月1日条件不变其他天数找不到朋友,不用for循环上代码算法,写出来了 ...

这个是数学问题又不是编程问题. 我只是考虑一种算法可以减少计算量. 你算出总天数再%5, 365%5 = 0;
你找出2006年到3005年之间的2月29日个数, 再去%5, 哪个更好理解?
还写出来打你脸? 我也没想打你脸, 我边上就有 TATA 的技术总监, 这想法也是他告诉我的. 上一阵子刚让一个总是说这个功能没法实现的二笔滚蛋.
又没让你去想高深算法, 告诉你怎么算你去码字就好了. 你来北京之前最起码也得先认识到自己智力有限吧. 谦虚点不吃亏. 不然到时候被总监虐哭岂不是很难看
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马