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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

3036803663

初级黑马

  • 黑马币:2

  • 帖子:6

  • 精华:0

© 3036803663 初级黑马   /  2015-10-31 13:42  /  6706 人查看  /  24 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

8黑马币
10、 小明从2006年1月1日开始,每三天结识一个美女两天结识一个帅哥,编程实现当输入2006年1月1日之后的任意一天,输出小明那天是结识美女还是帅哥(注意润年问题)(C语言)
(再给我解读一下这个题是什么意思,怎么感觉有歧义,能力有限求大神解答 分给的也够多了快来解答吧)

24 个回复

倒序浏览
关键是每三天结识一个美女两天结识一个帅哥这里有歧义。按照题的意思来说就是:从2006年开始,前三天是结识美女,接下来两天是帅哥。然后三天是美女,接下来是帅哥,这样一次循环下去。看看之后的某一天是结识的美女还是帅哥就好了
回复 使用道具 举报
确实有歧义
理解1:认识美女和认识帅哥是独立事件,分别使用一个循环
理解2:认识美女和认识帅哥是关联事件,使用一个周期为5天的循环
回复 使用道具 举报
应该是三天一帅哥,两天一美女,两天接着三天,而且三天中它都在认识帅哥,两天中它都认识美女,所以整体来说,不管哪一天,他不是认识帅哥就是认识美女,如果三天和两天有重叠那么这题 就不用算了,因为,它美女都在同时认识帅哥和美女,如果是不重叠也不要想当然的是三天中的最后一天认识帅哥,也不要认为两天中的最后一天认识美女。具体解答代码如下。
  1. //
  2. //  main.m
  3. //  基础测试10
  4. //
  5. //  Created by tsc on 15-10-28.
  6. //  Copyright (c) 2015年 tsc. All rights reserved.
  7. //

  8. #import <Foundation/Foundation.h>
  9. BOOL isLeapYear(int year) //判断year是不是瑞年
  10. {
  11.     //润年判断:
  12.     // 1 能被4整除但不能被100整除
  13.     // 2 能被400整除
  14.     if (( year % 4 == 0 && year % 100 != 0 ) || (year % 400 ==0)) {
  15.         return YES;  //闰年返回Yes
  16.     }
  17.     return  NO;//平年返回NO
  18. }
  19. void fun(int year,int month,int day)
  20. {
  21.     long daySum =0;//保存天从用户输入的时间到给定时间 中间的天数
  22.    
  23.     for (int i = 2006; i < year; i++) {//首先得到年份的总天数,不包括当前输入的年
  24.         if( isLeapYear(i))
  25.             daySum +=356; //闰年加356
  26.         else
  27.             daySum +=355; //平年加355
  28.     }
  29.     for(int i =1 ;i < month ;i ++)//再计算输入的年中月的天数,不包括输入的月
  30.     {
  31.         switch (month) {
  32.             case 1://1 3 5 7 8 10 12 都是31天
  33.             case 3:
  34.             case 5:
  35.             case 7:
  36.             case 8:
  37.             case 10:
  38.             case 12:
  39.                 daySum +=31;
  40.             break;
  41.                
  42.             case 4://2 4 6 8 11 都是30天
  43.             case 6:
  44.             case 9:
  45.             case 11:
  46.             daySum +=0;
  47.             break;
  48.             default:
  49.                 break;
  50.         }
  51.         if (isLeapYear(year)) {//年的二月份天数
  52.             daySum +=28;
  53.         }
  54.         else
  55.             daySum +=27;
  56.     }
  57.     daySum += day;  //最后加上输入的天数(day)
  58. //    NSLog(@"%ld",daySum);
  59.    
  60.     //三天一帅哥两天一美女,所以周期是5,求余之后 帅哥应该是1,2,3,美女是0和4
  61.     if ( daySum % 5 >= 4 || daySum % 5 ==0 ) {
  62.         NSLog(@"小明在%d年%d月%d日在认识美女",year,month,day);
  63.     }
  64.     else
  65.         NSLog(@"小明在%d年%d月%d日在认识帅哥",year,month,day);
  66. }
  67. int main(int argc, const char * argv[])
  68. {

  69.     @autoreleasepool {
  70.         int y,m,d;//y-->year,m-->month,d-->day
  71.         NSLog(@"请输入年月日,以空格分隔");
  72.         scanf("%d%d%d",&y,&m,&d); //输入年月日
  73.         fun(y,m,d);  //调用求解函数
  74.     }
  75.     return 0;
  76. }
复制代码

希望采纳
回复 使用道具 举报
我去,被领先了
回复 使用道具 举报
  1. #include <stdio.h>
  2. void selectMan(int year,int month,int day);
  3. int main(int argc, const char * argv[]) {
  4.     // insert code here...
  5.    
  6.     int year,month,day;
  7.    
  8.     printf("输入要查询的年月日按2006.1.1格式\n");
  9.     scanf("%d.%d.%d",&year,&month,&day);
  10.     selectMan(year, month, day);
  11.    
  12.    
  13.    
  14.     return 0;
  15. }
  16. void selectMan(int year,int month,int day)
  17. {
  18.     if(year<2006 || month<1 || month>12){
  19.         printf("输入错误");
  20.     }else
  21.     {
  22.         //year0是开始年
  23.         int year0 = 2006;
  24.         //numday 是一共多少天
  25.         int numday = 0;
  26.         //计算过了多少年,numyear为超过2006多少年
  27.         int numyear = year-year0;
  28.         //定义一个二维数组,区分闰年和平年的月累加的天
  29.         int months[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
  30.                             {0,31,29,31,30,31,30,31,31,30,31,30,31}};
  31.         
  32.         while (numyear>0) {
  33.             //判断该年是否是闰年
  34.             if((year0/4==0&&year0/100!=0)||(year0/400==0)){
  35.                 //当前年的天数,闰年
  36.                 numday += 366;
  37.             }
  38.             else
  39.             {
  40.                 //当前年的天数,平年
  41.                 numday += 365;
  42.             }
  43.             //year0的值是加到多少年了
  44.             year0++;
  45.             //加一年需要减少一年长度
  46.             numyear--;
  47.         }
  48.         //加上每个月中闰年或者平年的天数
  49.         for(int i=0; i<month;i++){
  50.             if((year0/4==0&&year0/100!=0)||(year0/400==0))
  51.             {
  52.                 numday = numday + months[1][i];
  53.             }
  54.             else
  55.             {
  56.                 numday = numday + months[0][i];
  57.             }
  58.         }
  59.         
  60.         //算出总天数
  61.         numday = numday + day-1;
  62.         printf("一共过了%d天\n",numday);
  63.         //过三天认识一个美女,又过两天认识一个帅哥,所以5天一个循环
  64.         if(numday%5==3){
  65.             printf("小明认识的是美女\n");
  66.         }
  67.         else if(numday%5==0){
  68.             printf("小明认识的是帅哥\n");
  69.         }else{
  70.             printf("没有认识人\n");
  71.         }
  72.         
  73.         
  74.     }
  75. }
复制代码
这道是黑马基础考试题,我之前提交满分,这个是我的代码,注释很详细,你可以参考下。有问题我再解释。
回复 使用道具 举报
这个人是骗答案的。。。
回复 使用道具 举报
前排围观
回复 使用道具 举报
个人认为应该判断这一天是3的倍数还是2的倍数,若都是则都结识
回复 使用道具 举报
我也刚做了这道题,下面是我的解答,希望对楼主有帮助

//小明从2006年1月1日开始,每三天结识一个美女两天结识一个帅哥,编程实现当输入2006年1月1日之后的任意一天,输出小明那天是结识美女还是帅哥(注意润年问题)
//计算 输入的日期 与2006年1月1日 相差几天
typedef struct{
    int year;
    int month;
    int day;
}Data;
//判断是否是闰年
int isLeapYear(int year)
{
    if((year%4==0&&year%100!=0)||year%400==0)
        return 1;
    else
        return 0;
}
//判断小明那天是结识美女还是帅哥
int meet_pg(int totaldays)
{
    if (totaldays%3==0) {
        return 1;
    }
    else
        return 0;
}
int meet_pb(int totaldays)
{
    if (totaldays%2==0) {
        return 1;
    }
    return 0;
}


int main(int argc, const char * argv[]) {
    printf("please enter your date,must be like this 2010 1 1");
    //处理输入日期错误。
    Data today;
    scanf("%d %d %d",&today.year,&today.month,&today.day);
    if (today.year<2006||today.month<1||today.month>12||today.day<1||today.day>31) {
        printf("Error:there is something wrong in your data");
        return 0;
    }
    if(today.month==2)
    {
        if (isLeapYear(today.year)) {
            if (today.month==2&&today.day>29) {
                printf("Error:leap year February only 28 days");
                return 0;
            }
            else
            {
                if (today.month==2&&today.day>28) {
                    printf("Error:leap year February only 28 days");
                    return 0;
                }
            }
        }
        else if (today.month==1||today.month==3||today.month==5||today.month==7||today.month==8||today.month==10||today.month==12) {
            if(today.day>31)
            {
                printf("Error:your data has wrong in day");
                return 0;
            }
        }else
        {
            if(today.day>30)
            {
                printf("Error:your data has wrong in day");
                return 0;
            }
        }
        
    }
    //计算相差日期。
    int totalDays=0;
    for (int year=2006; year<today.year; year++) {//计算年
        if (isLeapYear(year)) {
            totalDays+=366;
        }
        else{
            totalDays+=365;
        }
    }
   
    if (isLeapYear(today.year))//计算月
    {
        switch (today.month)
        {
            case 1:
                totalDays+=0;
                break;
            case 2:
                totalDays+=31;
                break;
            case 3:
                totalDays+=60;
                break;
            case 4:
                totalDays+=91;
                break;
            case 5:
                totalDays+=121;
                break;
            case 6:
                totalDays+=152;
                break;
            case 7:
                totalDays+=182;
                break;
            case 8:
                totalDays+=213;
                break;
            case 9:
                totalDays+=244;
                break;
            case 10:
                totalDays+=274;
                break;
            case 11:
                totalDays+=305;
                break;
            case 12:
                totalDays+=335;
                break;
        }
    }
    else
    {
        switch (today.month)
        {
            case 1:
                totalDays+=0;
                break;
            case 2:
                totalDays+=31;
                break;
            case 3:
                totalDays+=59;
                break;
            case 4:
                totalDays+=90;
                break;
            case 5:
                totalDays+=120;
                break;
            case 6:
                totalDays+=151;
                break;
            case 7:
                totalDays+=181;
                break;
            case 8:
                totalDays+=212;
                break;
            case 9:
                totalDays+=243;
                break;
            case 10:
                totalDays+=273;
                break;
            case 11:
                totalDays+=304;
                break;
            case 12:
                totalDays+=334;
                break;
        }
    }
    totalDays+=today.day-1;//计算日
    //printf("%d\n",totalDays);
    if (meet_pb(totalDays)) {
        printf("小明遇到了帅哥\n");
    }
    if (meet_pg(totalDays)) {
        printf("小明遇到了美女\n");
    }
    return 0;
   
}
回复 使用道具 举报
好多大神
回复 使用道具 举报
#include <stdio.h>  void test(int y, int m, int d);  int main() {     int year ;     int month;     int day;          do     {         printf("请输入2006-1-1之后的任意一天,年月日之间以-隔开\n");                  scanf("%d-%d-%d", &year, &month, &day);     } while (year<2006 || month<1 || month>12);          test(year, month, day);          return 0; }  void test(int y, int m, int d) {     int sumDaysOfYear = 0, sumDaysOfMonth = 0; // 年、月总天数          int sumDays; // 总天数          int minusYear = (y - 2006); // 计算相差的年数          // 计算相差年的总天数     for (int i = 0; i<minusYear; i++)     {         if ((2006+i)  % 4 ==0 && (2006+i) %100 != 0) // 当年份能被4整除又无法被100整除为闰年         {             sumDaysOfYear += 366;         }         else if ((2006+i) %400 ==0) // 当年份可以被400整除的为闰年         {             sumDaysOfYear += 366;         }         else         {             sumDaysOfYear += 365;         }              }          int leapYearMonths[12] = {31,29,31,30,31,30,31,31,30,31,30,31}; // 闰年的每月天数     int yearMonths[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; // 一般年每月天数          // 计算相差月的天数     for (int j = 1; j < m; j++) // 这里1月份进不来     {         if (y % 4 ==0 && y %100 != 0) // 当年份能被4整除又无法被100整除,为闰年         {             sumDaysOfMonth+= leapYearMonths[j-1];         }         else if (y % 400 ==0) // 当年份可以被400整除的为闰年         {             sumDaysOfMonth+= leapYearMonths[j-1];         }         else         {             sumDaysOfMonth += yearMonths[j-1];         }              }          sumDays = sumDaysOfYear + sumDaysOfMonth +d; // 年月日的总天数          // 判断结识了什么人     if (sumDays %2 ==0)     {         printf("小明结识了帅哥\n");     }          if (sumDays %3 ==0)     {         printf("小明结识了美女\n");     }          if (sumDays %2 !=0 && sumDays %3 !=0)     {         printf("小明既没有结识美女也没有结识帅哥\n");     }      }
回复 使用道具 举报
都是高手啊!自觉惭愧
回复 使用道具 举报
,我没想明白,只能默默的支持你一下!
回复 使用道具 举报
小明从2006年1月1日开始,每三天结识一个美女两天结识一
    个帅哥,编程实现当输入2006年1月1日之后的任意一天,输
    出小明那天是结识美女还是帅哥(注意润年问题)(C语言)
*/

#include <stdio.h>

    //声明函数
int getDays(int y, int m, int d);
int runYear(int y);
int jieShouData(int y, int m, int d);

    //定义数组用来存放闰年和非闰年每月的天数
int pingYearM[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int runYearM[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};


int main(int argc, const char * argv[]) {
    //定义类型的变量
    //提示用户输入并接收日期
    //判断用户输入信息是否有误,如有提示用户重新输入
    int year, month, day;
    do {
        printf("亲耐滴,请输入2006 1 1 之后的日期,中间用空格隔开:\n");
        scanf("%d %d %d", &year, &month, &day);
    } while (jieShouData(year, month, day));
   
   
    //调用getDays函数,计算输入日期距离2006-1-1的总天数
    int allDays = getDays(year, month, day);
   
   
    //利用总天数计算小明某天是否结识帅哥美女
    //总天数能被2整除就结识帅哥
    //总天数能被3整除就结识美女
    //总天数如果不能被2和3整除,就不结识帅哥,也不结识美女
    if (allDays % 3 == 0)
        printf("我靠!小明今天结识了美女!\n");
    if (allDays % 2 == 0)
        printf("运气不错哦,小明今天结识帅哥!\n");
    if ((allDays % 2 != 0) && (allDays % 3 != 0))
        printf("不会吧?小明今天居然没有结识帅哥,也没有结识美女!\n");
    return 0;
}

    //定义函数计算输入日期距离2006-1-1的总天数
    //定义两个变量用来存储年份,月份相差的天数
    //如果是闰年,年份天数加上366不是加365
int getDays(int y, int m, int d)
{
    int yearDays = 0, monthDays = 0;
    for (int i = 2006; i < y; i++) {
        if (runYear(i))
            yearDays += 366;
        else
            yearDays += 365;
    }
    //计算输入月份与1月1日之间相差的天数
    //如果是闰年,就累加闰年所对应月份的天数
    //如果不是闰年,就累加非闰年所对应月份的天数
    for (int j = 1; j < m; j++) {
        if (runYear(y))
            monthDays += pingYearM[j-1];
        else
            monthDays += runYearM[j-1];
    }
    //计算总天数并返回
    int allDays = yearDays + monthDays +d;
    return allDays;
}
/*  新建一个函数用来判断是否是闰年
    1)非整百年能被4整除的为闰年
    2)整百年能被400整除的是闰年
*/
    //如果是闰年,返回1,否则返回0
int runYear(int y)
{
    if ( (y%4==0 && y%100!=0) || (y%400==0) )
        return 1;
    else
        return 0;
}

    //新建一个函数用来判断输入的日期是否合理,不合理返回1,合理返回0
    //如果年份小于2006、或月份小于1、或月份大于12、或日小于1,则日期不合理
    //如果是闰年
    //当天数大于当月所对应的最大天数,则不合理
int  jieShouData(int y, int m, int d)
{
    if (y<2006 || m<1 || m>12 || d<1)
        
        return 1;
        if (runYear(y))
        return d > runYearM[m-1];
    else
        return d > pingYearM[m-1];
}
回复 使用道具 举报
小明从2006年1月1日开始,每三天结识一个美女两天结识一
    个帅哥,编程实现当输入2006年1月1日之后的任意一天,输
    出小明那天是结识美女还是帅哥(注意润年问题)(C语言)
*/

#include <stdio.h>

    //声明函数
int getDays(int y, int m, int d);
int runYear(int y);
int jieShouData(int y, int m, int d);

    //定义数组用来存放闰年和非闰年每月的天数
int pingYearM[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int runYearM[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};


int main(int argc, const char * argv[]) {
    //定义类型的变量
    //提示用户输入并接收日期
    //判断用户输入信息是否有误,如有提示用户重新输入
    int year, month, day;
    do {
        printf("亲耐滴,请输入2006 1 1 之后的日期,中间用空格隔开:\n");
        scanf("%d %d %d", &year, &month, &day);
    } while (jieShouData(year, month, day));
   
   
    //调用getDays函数,计算输入日期距离2006-1-1的总天数
    int allDays = getDays(year, month, day);
   
   
    //利用总天数计算小明某天是否结识帅哥美女
    //总天数能被2整除就结识帅哥
    //总天数能被3整除就结识美女
    //总天数如果不能被2和3整除,就不结识帅哥,也不结识美女
    if (allDays % 3 == 0)
        printf("我靠!小明今天结识了美女!\n");
    if (allDays % 2 == 0)
        printf("运气不错哦,小明今天结识帅哥!\n");
    if ((allDays % 2 != 0) && (allDays % 3 != 0))
        printf("不会吧?小明今天居然没有结识帅哥,也没有结识美女!\n");
    return 0;
}

    //定义函数计算输入日期距离2006-1-1的总天数
    //定义两个变量用来存储年份,月份相差的天数
    //如果是闰年,年份天数加上366不是加365
int getDays(int y, int m, int d)
{
    int yearDays = 0, monthDays = 0;
    for (int i = 2006; i < y; i++) {
        if (runYear(i))
            yearDays += 366;
        else
            yearDays += 365;
    }
    //计算输入月份与1月1日之间相差的天数
    //如果是闰年,就累加闰年所对应月份的天数
    //如果不是闰年,就累加非闰年所对应月份的天数
    for (int j = 1; j < m; j++) {
        if (runYear(y))
            monthDays += pingYearM[j-1];
        else
            monthDays += runYearM[j-1];
    }
    //计算总天数并返回
    int allDays = yearDays + monthDays +d;
    return allDays;
}
/*  新建一个函数用来判断是否是闰年
    1)非整百年能被4整除的为闰年
    2)整百年能被400整除的是闰年
*/
    //如果是闰年,返回1,否则返回0
int runYear(int y)
{
    if ( (y%4==0 && y%100!=0) || (y%400==0) )
        return 1;
    else
        return 0;
}

    //新建一个函数用来判断输入的日期是否合理,不合理返回1,合理返回0
    //如果年份小于2006、或月份小于1、或月份大于12、或日小于1,则日期不合理
    //如果是闰年
    //当天数大于当月所对应的最大天数,则不合理
int  jieShouData(int y, int m, int d)
{
    if (y<2006 || m<1 || m>12 || d<1)
        
        return 1;
        if (runYear(y))
        return d > runYearM[m-1];
    else
        return d > pingYearM[m-1];
}
回复 使用道具 举报
tsc0000 发表于 2015-11-1 08:58
应该是三天一帅哥,两天一美女,两天接着三天,而且三天中它都在认识帅哥,两天中它都认识美女,所以整体来 ...

我去被领先了
回复 使用道具 举报
可以严肃点吗
回复 使用道具 举报
如果是三天结合美女两天认识帅哥,那么就是5天一个循环,可以算出总天数,然后除余判断
回复 使用道具 举报
好高大上的感觉
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马