1900年1月1日为星期一:
#include
int test(int year) {//闰年返回1
if((year%400==0)||(year%4==0&&year%100!=0)) return 1;
return 0;
}
void main(){
int year,i;
long sum=0;// 计算1900到你输进的年的总天数
printf("\nInput year(year>=1900):");
scanf("%d",&year);
for(i=1900;i
sum+=365 ;
if(test(year)==1) sum+=1;
}
printf("\n%d-1-1: ",year);
int fg=sum%7;
switch(fg) {
case 0: printf("星期一"); break;
case 1:printf("星期二"); break;
case 2:printf("星期三"); break;
case 3:printf("星期四"); break;
case 4:printf("星期五" ); break;
case 5:printf("星期六"); break;
case 6:printf("星期日"); break;
}
printf("\n\n\t");
}
//测试通过,望采纳
#include
int dysforcompeleteyears(int startyear,int endyear){ //星期几
int sum=0;
for(int i=startyear;iif(i%400==0||i%4==0&&i%100!=0)
sum+=366;
else
sum+=365;
return sum;
}
int daysforcurrentyear(int year,int month,int day){
int ss[13]={31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=0;iday+=ss[i];
if((year%400==0||(year%4==0&&year%100!=0))&&month>2)
day++;
return day;
}
int main(){
int year,month,day;
scanf("%d-%d-%d",&year,&month,&day);
int sum=0;
sum+=dysforcompeleteyears(1900,year);
sum+=daysforcurrentyear(year,month,day);
sum%=7;
if(sum==0)
printf("星期日\n");
else
printf("星期%d\n",sum);
return 0;
}
//输入格式 如:2014-5-17 这样输入才是对的
第四周编程作业第题确定母亲节
2
确定母亲节(10分)
题目内容:
母亲节是每年的五月第二个星期天,针对输入的年份,计算该年的哪一天是母亲节。
输入格式:
年份
输出格式:
日期(5月的哪一天)
输入样例:
2014
输出样例:
11
时间限制:500ms内存限制:32000kb
这道题目网上有两种方法,都可以通过,第一种方法
#include
int main()
{
int year, n, week, total, day;
scanf("%d",&year);
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
week = (year + year / 4 + year / 400 - year / 100 - 1) % 7;
for(n = 0;n < 5; n++)
{
if(n == 0) total = 0;
if(n == 1 || n == 3) total += 31;
if(n == 2) total += 29;
if(n == 4) total += 30;
}
}
else
{
week = (year + year / 4 + year / 400 - year / 100) % 7;
for(n = 0; n < 5; n++)
{
if(n == 0) total = 0;
if(n == 1 || n == 3) total += 31;
if(n == 2) total += 28;
if(n == 4) total += 30;
}
}
week = (week + total) % 7;
if (week == 0) week = 7;
day = 7 - week + 8;
printf("%d\n",day);
return 0;
}
//程序里语句 week = (year + year / 4 + year / 400 - year / 100 - 1) % 7;
//及week = (week + total) % 7;
// day = 7 - week + 8;
//这三条语句应该如何理解?
第二种方法
#include
{int year,b,n;
scanf("%d",&year);
b=(year-1720)%28;
switch(b)
{case 0:n=14;break;case 1:n=13;break;case 2:n=12;break;case 3:n=11;break;case 4:n=9;break;case 5:n=8;break;case 6:n=14;break;case 7:n=13;break;case 8:n=11;break;case 9:n=10;break;case 10:n=9;break;case 11:n=8;break;case 12:n=13;break;case 13:n=12;break;case 14:n=11;break;case 15:n=10;break;case 16:n=8;break;case 17:n=14;break;case 18:n=13;break;case 19:n=12;break;case 20:n=10;break;case 21:n=9;break;case 22:n=8;break;case 23:n=14;break;case 24:n=12;break;case 25:n=11;break;case 26:n=10;break;case 27:n=9;break;
}
printf("%d\n",n);return 0;
}
//程序中语句b=(year-1720)%28; 应该如何理解?
第三题
计算星期(10分)
题目内容:
给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几。
输入格式:
年 月 日
输出格式:
0~6。
星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。
假设年份大于1900。先想一想:我们现在只会使用 if 语句,该如何建立数学模型?
输入样例:
2013 3 11
输出样例:
1
输入样例:
2013 13 15
输出样例:
month is error.
输入样例:
2013 3 32
输出样例:
day is error.
测试代码完全通过
#include
int dysforcompeleteyears(int startyear,int endyear){ //星期几
int sum=0;
for(int i=startyear;i
sum+=366;
else
sum+=365;
return sum;
}
int daysforcurrentyear(int year,int month,int day){
int ss[13]={31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=0;i
if((year%400==0||(year%4==0&&year%100!=0))&&month>2)
day++;
return day;
}
int main(){
int year,month,day;
scanf("%d%d%d",&year,&month,&day);
if(year <= 1900 ){
printf("year is error.\n");
return 0;
}
if(month >= 13 || month < 1){
printf("month is error.\n");
return 0;
}
if(day < 0){
printf("day is error.\n");
return 0;
}
switch(month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(day > 31){
printf("day is error.\n");
return 0;
}
break;
case 4:
case 6:
case 9:
case 11:
if(day > 30){
printf("day is error.\n");
return 0;
}
break;
case 2:
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
if(day > 29){
printf("day is error.\n");
return 0;
}
}
else{
if(day > 28){
printf("day is error.\n");
return 0;
}
}
break;
}
int sum=0;
sum+=dysforcompeleteyears(1900,year);
sum+=daysforcurrentyear(year,month,day);
sum%=7;
if(sum==0)
printf("0\n");
else
printf("%d\n",sum);
return 0;
}
测试代码只是依据1900年1月1日为星期一,当然也可依据公元元年1月1日(即1年1月1日)为星期一件题目要求的1900年扩充至公元后的任何日期,说明第二题确定母亲代码的疑问均属于公式,有大神有公式的推导证明分享下,吾等必将感激不尽
#include
#include
int get_week(int);
int get_week(int year)
{
struct tm tm;
if (year < 1970 || year>3000)return -1;
memset(&tm, 0, sizeof tm);
tm.tm_year = year - 1900;
tm.tm_mday = 1;
mktime(&tm);
return tm.tm_wday;
}
星期日为0,星期一--星期六为1--6