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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

zhanghuiye

中级黑马

  • 黑马币:42

  • 帖子:5

  • 精华:0

© zhanghuiye 中级黑马   /  2014-10-21 13:07  /  2654 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

基础测试题:

/*
小明从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;
}


评分

参与人数 1技术分 +1 收起 理由
星河鹭起 + 1

查看全部评分

6 个回复

倒序浏览
我改了改,别人写得,大家看看,怎么样?

#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:26 编辑

啊啊啊啊啊啊
回复 使用道具 举报
我觉得还有更简单的算法
回复 使用道具 举报
哈哈哈 我也做的这道题
回复 使用道具 举报
过两天也用Oc做一下
回复 使用道具 举报
这个题 对我们这些基础基本为零的学生来说 有点变态 有木有
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马