黑马程序员技术交流社区
标题: 小明在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 |