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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© legendary 中级黑马   /  2014-7-18 23:49  /  4781 人查看  /  27 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

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

27 个回复

倒序浏览
本帖最后由 为梦想挺身而出 于 2014-7-19 00:26 编辑

  1. 楼主参考下
复制代码
  1. #include <stdio.h>

  2. void test(int y, int m, int d);

  3. int main()
  4. {
  5.     int year ;
  6.     int month;
  7.     int day;
  8.    
  9.     do
  10.     {
  11.         printf("请输入2006-1-1之后的任意一天,年月日之间以-隔开\n");
  12.         
  13.         scanf("%d-%d-%d", &year, &month, &day);
  14.     } while (year<2006 || month<1 || month>12);
  15.    
  16.     test(year, month, day);
  17.    
  18.     return 0;
  19. }

  20. void test(int y, int m, int d)
  21. {
  22.     int sumDaysOfYear = 0, sumDaysOfMonth = 0; // 年、月总天数
  23.    
  24.     int sumDays; // 总天数
  25.    
  26.     int minusYear = (y - 2006); // 计算相差的年数
  27.    
  28.     // 计算相差年的总天数
  29.     for (int i = 0; i<minusYear; i++)
  30.     {
  31.         if ((2006+i)  % 4 ==0 && (2006+i) %100 != 0) // 当年份能被4整除又无法被100整除为闰年
  32.         {
  33.             sumDaysOfYear += 366;
  34.         }
  35.         else if ((2006+i) %400 ==0) // 当年份可以被400整除的为闰年
  36.         {
  37.             sumDaysOfYear += 366;
  38.         }
  39.         else
  40.         {
  41.             sumDaysOfYear += 365;
  42.         }
  43.         
  44.     }
  45.    
  46.     int leapYearMonths[12] = {31,29,31,30,31,30,31,31,30,31,30,31}; // 闰年的每月天数
  47.     int yearMonths[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; // 一般年每月天数
  48.    
  49.     // 计算相差月的天数
  50.     for (int j = 1; j < m; j++) // 这里1月份进不来
  51.     {
  52.         if (y % 4 ==0 && y %100 != 0) // 当年份能被4整除又无法被100整除,为闰年
  53.         {
  54.             sumDaysOfMonth+= leapYearMonths[j-1];
  55.         }
  56.         else if (y % 400 ==0) // 当年份可以被400整除的为闰年
  57.         {
  58.             sumDaysOfMonth+= leapYearMonths[j-1];
  59.         }
  60.         else
  61.         {
  62.             sumDaysOfMonth += yearMonths[j-1];
  63.         }
  64.         
  65.     }
  66.    
  67.     sumDays = sumDaysOfYear + sumDaysOfMonth +d; // 年月日的总天数
  68.    
  69.     // 判断结识了什么人
  70.     if (sumDays %2 ==0)
  71.     {
  72.         printf("小明结识了帅哥\n");
  73.     }
  74.    
  75.     if (sumDays %3 ==0)
  76.     {
  77.         printf("小明结识了美女\n");
  78.     }
  79.    
  80.     if (sumDays %2 !=0 && sumDays %3 !=0)
  81.     {
  82.         printf("小明既没有结识美女也没有结识帅哥\n");
  83.     }
  84.    
  85. }
复制代码


回复 使用道具 举报
楼主做的是基础测试么,如果是基础测试建议楼主把我的代码更改一下,前面的时间就不要用数组来表示了,直接用数字,比如一月就加上31,2月就是59(非闰年(31+28)),三月就是99(31+28+30),以此类推。把计算好的天数直接传进去。不要用数组再计算了。下面是我的用数组的源码。
  1. #include<stdio.h>

  2. int isRN(int year);
  3. int main()
  4. {
  5.     int year,month,day;
  6.     int months[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
  7.                       {0,31,29,31,30,31,30,31,31,30,31,30,31}};/*定义一个二维数组,区分闰年和平年的月累加的天数。第一个用0表示是因为用
  8.                                                                 户输入的月份肯定大于1,数组中第一个元素肯定会被加上,第一个数据是0 的话,天数累加之后实际天数不变。  */
  9.    
  10.     printf("请输入年(年>= 2006):\n");
  11.     scanf("%d",&year);
  12.     printf("请输入月(1 <= 月<= 12):\n");
  13.     scanf("%d",&month);
  14.     printf("请输入几号(1 <= 数字 <= 31):\n");
  15.     scanf("%d",&day);
  16.    
  17.     int length = year - 2006;//计算输入的几年,长度。
  18.     int sumdays,year1 =2006;//sumdays是一个全局变量。
  19.    
  20.     while(length > 0)
  21.     {
  22.         if(isRN(year1))
  23.         {
  24.             sumdays = sumdays + 366;//累加年的天数,要先进行判断。闰年的天数
  25.         }
  26.         else
  27.         {
  28.             sumdays = sumdays + 365;//平年的天数
  29.         }
  30.         year1++;//累加的几年,顺便计算这几年中是否有闰年,所以只能一年一年的加
  31.         length--;//累加的次数
  32.     }
  33.    
  34.     for(int i = 0; i < month; i++)
  35.     {
  36.         if(isRN(year1))
  37.         {
  38.             sumdays = sumdays + months[1][i];//是闰年则调用含有29天数组
  39.         }
  40.         else
  41.         {
  42.             sumdays = sumdays + months[0][i];
  43.         }
  44.     }
  45.    
  46.     sumdays = sumdays + day;//最后再加上天数
  47.    
  48.     sumdays = sumdays % 5;//模运算,因为是一个循环
  49.    
  50.     if(1 <= sumdays && sumdays <= 3)
  51.     {
  52.         printf("小明认识的是美女\n");
  53.     }
  54.     else
  55.     {
  56.         printf("小明认识的是帅哥\n");
  57.     }
  58.     return 0;
  59. }

  60. int isRN(int year)//判断函数
  61. {
  62.     if((year/4==0&&year/100!=0)||(year/400==0))//闰年的计算是能被4整除,且不能被100整除,能被400整除。百度而来。
  63.     {
  64.         return 1;
  65.     }
  66.     else
  67.     {
  68.         return 0;
  69.     }
  70.    
  71. }
复制代码
回复 使用道具 举报
楼主千万不要直接抄写,自己要做一定的修改。思路都已经给你了
回复 使用道具 举报
爱情路13号 发表于 2014-7-19 00:10
楼主千万不要直接抄写,自己要做一定的修改。思路都已经给你了

谢谢你啦,我今天又做了一遍,有答案了
回复 使用道具 举报
我想问下,是不是第六天即认识美女,又认识帅哥。这个不是又歧义的嘛,还是说清楚比较好吧
回复 使用道具 举报
邱蚓 中级黑马 2014-7-19 22:16:27
7#
秋天的悲伤 发表于 2014-7-19 19:49
我想问下,是不是第六天即认识美女,又认识帅哥。这个不是又歧义的嘛,还是说清楚比较好吧 ...

是的。。。只要同时是2跟3的倍数的话就会认识帅哥跟美女
回复 使用道具 举报
想想自己貌似也不会。
回复 使用道具 举报
  这个真的难,关键 是  闰年怎么计算的我都不知道
回复 使用道具 举报
点个赞吧,又见高手了
回复 使用道具 举报
牛啊,以前学过吧,进几期的
回复 使用道具 举报
算出总天数除以3,能被3整除结识美女,能被2整除就结识帅哥,能被6整除既结识美女又结识帅哥。
回复 使用道具 举报
万雷 高级黑马 2014-10-12 11:37:50
13#
爱情路13号 发表于 2014-7-19 00:09
楼主做的是基础测试么,如果是基础测试建议楼主把我的代码更改一下,前面的时间就不要用数组来表示了,直接 ...

您 这个 程序是有点小问题的,怎么都运行不出来,说是语法错误,我检查了好几遍,也没发现,求高手指点迷津
回复 使用道具 举报
这个程序,关键在天数的运算上,而天数的运算我能想到的,有两种思路,一个是闰年和平年只有二月不一样,二月单算,另一种思路是闰年和平年整体不一样 整体单独计算。
回复 使用道具 举报 1 0

楼主,这题我是这样做的。我也刚做了那个测试,希望咱们一起交流,下面我贴上我的代码。
#include <stdio.h>
void putout(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);
    //将合法的年月日作为形参调用putout函数
    putout(year, month, day);
   
    return 0;
}
void putout(int y, int m, int d)
{
int ytempt=2006;//定义一个变量来标记年份
int mtempt=1;//定义一个变量来标记月份
int dtempt=1;//定义一个变量来标记天
int sum=0;//定义一个变量来保存总天数
int i=2;//平年闰年标记
while (ytempt<y) {//当年份标记小于输入的年份时执行下面循环体
  if(i%4) sum+=365;//因为2006年是平年,2008年是闰年,所以定义i初始值为2来标记平年闰年,如果i不能被4整除,总天数在原有基础上+365
  else sum+=366;//如果是闰年则+366
  ytempt++;//进入下一年
  i++;//闰年标记+1
}
//当条件不满足时进入月份判断
while (mtempt<m){//如果标记月份小于输入的月份,则进入下面循环体
if(mtempt==1||mtempt==3||mtempt==5||mtempt==7||mtempt==8||mtempt==10) sum+=31;//一三五七八十腊,三十一天永不差,m最大值为12,所以mtempt=12不会执行这一句
if(mtempt==2){//标记月份来到二月份
if(i%4) sum+=28;//平月天数+28;
else sum+=29;//闰月天数+29
}
else sum+=30;//其他月份天数+30
mtempt++;//月份标记加1;
}
//年,月都比较运算完后进入日期判断
while (dtempt<d) {//如果日期标记小于输入的日期
  sum++;//天数加1;
  dtempt++;//日期标记+1;进入下一天。
}
// printf("sum=%d\n",sum);
if(sum%2==0){//小明每隔两天认识一个帅哥
printf("小明认识了帅哥\n");
}
if(sum%3==0){//小明每隔三天认识一个美女
printf("小明认识了美女\n");
}
if(sum%3&&sum%2){
printf("小明即没认识了美女,也没认识帅哥\n");
}
}

回复 使用道具 举报
chaoren 发表于 2015-3-4 16:30
楼主,这题我是这样做的。我也刚做了那个测试,希望咱们一起交流,下面我贴上我的代码。
#include
void  ...

我的思路是想判断年,隔一年的话,加上整年的天数。用一个循环体,设置一个变量标记年份,每循环一次,标记+1;这其中就有判断平年和闰年,我也是设置了一个变量来标记,因为2006年是平年,2008年是闰年,每四年一润,所以我就设置闰年标记初始值为2.年循环完了再比较月份,同样设置一个变量标记月份,每个月加不同的天数,最后在进入天数比较时,说明已经的同年同月了,同样的思想。即可获得相差的天数
回复 使用道具 举报
学习了,很好的帖子
回复 使用道具 举报
爱情路13号 发表于 2014-7-19 00:10
楼主千万不要直接抄写,自己要做一定的修改。思路都已经给你了

那个年月日 用结构体也可以把
回复 使用道具 举报
此生逍遥 发表于 2014-9-17 23:34
算出总天数除以3,能被3整除结识美女,能被2整除就结识帅哥,能被6整除既结识美女又结识帅哥。 ...

我考,我抽到的就是这道题!
回复 使用道具 举报

这样编写不是特别严谨 例如输入“2008-2-31”会显示“小明结识了美女 小明结识了帅哥”但是2月根本没有31日这天
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马