在黑马报考环节里的有一道比较有意思的测试题,题目:
小明从2006年1月1日开始,每三天结识一个美女两天结识一个帅哥,编程实现当输入2006年1月1日之后的任意一天,输出小明那天是结识美女还是帅哥(注意润年问题)(C语言)
想要答对题目,首先必须得读懂题目,弄清楚出题者到底想要考我们社么知识点。首先,这道题要考我们C语法里的输入与输出相关知识,其次,要考我们对C语言算数运算的基础知识,还有一个简单的算法知识,如:判断是否闰年。当然,在编程里,可读性与精简性能够体现程序员的基本素质,所以,在完成答案写出自己的程序时,给出适当的注释,保持代码精简逻辑清晰是非常重要的。
解题思路:先获取用户输入的日期,计算出输入的日期与2006年1月1日相差的总天数,如果能被2整除,说明小明认识了帅哥,如果能被3整除,说明小明认识了美女,如果能被2和3的倍数6整除,说明小明既认识了帅哥又认识了美女。
#include <stdio.h>
int leapYear(int);
int boyOrGirl(int, int, int);
int main(int argc, constchar * argv[]) {
intyear,month,day;
do
{
printf("请输入2006-1-1之后的任意一天,年月日之间以-隔开\n");
scanf("%d-%d-%d",&year, &month, &day);
} while(year<2006 || month<1 || month>12 ||day<1 || day>31);
boyOrGirl(year,month,day);
return0;
}
//是否是闰年
int leapYear(int year){
int isLeap= 0;
//不能被4整除的,不是闰年
if (year%4 == 0)
{
if (year%100 == 0)
{
if (year%400 == 0)
{
//能被400整除的,是闰年
isLeap = 1;
}
}else{
//能被4整除,但不能被100整除的,不是闰年
isLeap = 1;
}
}
returnisLeap;
}
//判断结识的是帅哥还是美女,还是帅哥和美女都结识了
int boyOrGirl(year, month, day){
intallday=0;
intsumMonths[2][13]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
//累加2006年到目标年之间的所有年的总天使
for (int i = 2006; i< year; i++) {
if(leapYear(i)){
allday = allday+366;//闰年
}else{
allday = allday+365;//平年
}
}
intisleapYear = leapYear(year);
//累加目标年的1月份到目标月份之间的所有月份的总天数
for(int j = 1; j< month; j++)
{
allday = allday +sumMonths[isleapYear][j];//是闰年则2月有29天
}
//防止用户输入的日数超出所在月该有的天数
if(sumMonths[isleapYear][month]< day) day = sumMonths[isleapYear][month];
//再加上天数
allday += day;
if(allday%6 == 0){
printf("小明既认识了帅哥,又认识了美女\n");
}elseif(allday%2 == 0){
printf("小明认识的是帅哥\n");
}elseif(allday%3 == 0){
printf("小明认识的是美女\n");
}else{
printf("小明没有认识了帅哥,也没有认识了美女\n");
}
return0;
}