黑马程序员技术交流社区

标题: 小明在2006-1-1后某一天是否搞基 [打印本页]

作者: zhanghuiye    时间: 2014-10-21 13:07
标题: 小明在2006-1-1后某一天是否搞基
基础测试题:

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

*/

我的代码:冗余比较多,凑合看.

#import <Foundation/Foundation.h>


//定义一个返回值为BOOL类型的函数,用来判断xxxx年是否是闰年
BOOL isLeapYear (int n)
{
    if ((n % 4 == 0)&&(n %100 != 0))
        return YES;

    else if (n % 400 == 0)
        return YES;

    else
        return NO;
}

//定义一个函数来检测输入日期的合法性
BOOL dateIsLegal(int a,int b,int c)
{
    if (a < 2006)
        return NO;

    else if (a == 2006 && b == 1 && c == 1)
        return NO;

    else
        return YES;
}


int main(int argc, const char * argv[])
{
    //定义三个参数用来存放用户输入的年、月、日
    int year,month,day;

    printf("请输入2006年1月1日后的任意一天,格式按照2007-9-1形式书写:\n");
    scanf("%d-%d-%d",&year,&month,&day);

    //判别用户输入的日期是否合法
    if (dateIsLegal(year, month, day)!=1)
    {
        printf("日期不合法,请输入2006-1-1后的日期\n");
        return -1;    //程序非正常退出
    }


    //算出相差的年的天数的和,例如如果输入的是2008-xx-xx,那么这个应该结果是2006年的总天数加上2007年的总天数;如果输入的时2006-xx-xx,那么这个结果应该为0;
    int sumDayofyear = 0;
    for (int i = 2006; i<year; i++) {
        if(isLeapYear(i))
            sumDayofyear+=366;
        else
            sumDayofyear+=365;

    }

    //定义两个数组分别存放非闰年和闰年的12个月份的天数
    int normalYear[12] ={31,28,31,30,31,30,31,31,30,31,30,31};
    int leapYear[12] = {31,29,31,30,31,30,31,31,30,31,30,31};

    //算出相差月的天数的和;
    int sumDayofmonth = 0;
    for (int j =1; j<month; j++) {
        if (isLeapYear(year)) {
            sumDayofmonth+=leapYear[j-1];
        }
        else
            sumDayofmonth+=normalYear[j-1];
    }

    //    printf("sumDayofyear = %d\n",sumDayofyear);
    //    printf("sumDayofmonth = %d\n",sumDayofmonth);

    int sumDay = sumDayofyear + sumDayofmonth + day;

    //判别小明今天认识的是谁
    if ((sumDay%2 == 0)&&(sumDay%3!=0)) {
        printf("小明%d-%d-%d认识了一个美女\n",year,month,day);
    }

    else if((sumDay%3 == 0)&&(sumDay%2!=0))
        printf("小明%d-%d-%d认识了一个帅哥\n",year,month,day);

    else if((sumDay%3 == 0)&&(sumDay%2 == 0))
        printf("小明%d-%d-%d既认识了一个美女,也认识了一个帅哥\n",year,month,day);

    else
        printf("小明今天谁也没认识\n");

    //程序正常退出
    return 0;
}



作者: songzhi    时间: 2014-11-30 18:40
我改了改,别人写得,大家看看,怎么样?

#include <stdio.h>

int main()
{
    int year ;
    int month;
    int day;
  printf("请输入2006-1-1之后的任意一天,年月日之间以-隔开\n");
     
scanf("%d-%d-%d", &year, &month, &day);


    int sumDaysOfYear = 0,
    int sumDays;
    int minusYear = (y - 2006);
    int  n=0 //闰年个数
  
  for (int i =2006; i<year; i++)
    {
        if ((i%4==0&&i%100!=0)||i%400==0 )// 判断闰年
            n++
    }
    sumDaysOfYear=minusYear*365+n
    int leapYearMonths[13] = {0,31,60,91,121,152,182,213,244,274,305,335,366}; // 闰年月累积天数,直接算出来用

if(year%4==0&&year%100!=0)||year%400==0)
  {         
sumDaysOfMonth=leapYearMonths[month-1];// 如5月,则累积前四个月的天数
}
else
{
if(mouth=<2)
sumDaysOfMonth=leapYearMonths[month-1];
else
sumDaysOfMonth=leapYearMonths[month-1]-1;
}

    sumDays = sumDaysOfYear + sumDaysOfMonth +day; // 年月日的总天数
   
    // 判断结识了什么人
    if (sumDays %2 ==0)
    {
        printf("小明结识了帅哥\n");
    }
   
    if (sumDays %3 ==0)
    {
        printf("小明结识了美女\n");
    }
   
    if (sumDays %2 !=0 && sumDays %3 !=0)
    {
        printf("小明既没有结识美女也没有结识帅哥\n");
    }
   
}
作者: weizhang00    时间: 2014-12-1 22:21
本帖最后由 weizhang00 于 2014-12-1 22:26 编辑

啊啊啊啊啊啊
作者: 晓风_残月    时间: 2014-12-17 14:34
我觉得还有更简单的算法
作者: 梦拾荒年    时间: 2014-12-29 17:24
哈哈哈 我也做的这道题
作者: darewolf    时间: 2015-3-19 15:26
过两天也用Oc做一下
作者: ambition    时间: 2015-5-8 15:08
这个题 对我们这些基础基本为零的学生来说 有点变态 有木有




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2