这题不知老师为啥把题目给关了,幸好在关题目之前就做出来并提交通过了。
相关资料见下面链接:
https://blog.csdn.net/blackgooes/article/details/51364038
结论整理:
公式为:w=((c/4)-2c+y+y/4+(13(mon+1)/5)+d-1)%7;
注意事项:
1、m=1时,取m=13;m=2时,取m=14;
2、w要对7取模,取模后要保证w在0-6的范围,增加if判断处理;
3、输出注意用\t输出tab键;
网上的推算函数:
#include<iostream>
using namespace std;
//泰勒公式推算星期几
int weekday(int y,int m,int d)
{
if(m==1)
{
m=13;y--;
}
if(m==2)
{
m=14;y--;
}
int c = y/100;
y=y%100;
return ((c/4)-2*c+y/4+y+(13*(m+1)/5)+d-1)%7;
}
int main()
{
int y,m,d;
while(cin>>y>>m>>d)
{
int wd=weekday(y,m,d);
if(wd<0)
wd+=7;
switch(wd)
{
case 6:cout<<"星期六";break;
case 0:cout<<"星期天";break;
case 1:cout<<"星期一";break;
case 2:cout<<"星期二";break;
case 3:cout<<"星期三";break;
case 4:cout<<"星期四";break;
case 5:cout<<"星期五";break;
}
cout<<endl;
}
return 0;
}
娃的代码记录如下:
//#include<iostream>
#include<cstdio>
using namespace std;
bool run(int n){
if (n%4==0){
if (n%100==0&&n%400!=0) return 0;
if (n%400==0) return 1;
return 1;
}
return 0;
}
int riqi(int n,int m){
if (m==1||m==3||m==5||m==7||m==8||m==10||m==12) return 31;
else if (m!=2) return 30;
else {
if (run(n)) return 29;
return 28;
}
}
int main()
{
int n,m,d=1;
//cin>>n>>m;
scanf("%d%d",&n,&m);
int w;
int c=n/100,y=n%100,mon=m;
if (mon<3)
{
c=(n-1)/100;y=(n-1)%100;mon=m+12;
}
w=((c/4)-2*c+y+y/4+(13*(mon+1)/5)+d-1)%7;
//w=y+y/4+c/4-2*c+(26*(m+1))/10+d-1;
if (w<0) w+=7;//先取模,再用if判断,不要用while判断。
//w%=7;
//cout<<w<<endl;
printf("%c\t%c\t%c\t%c\t%c\t%c\t%c\n",'S','M','T','W','T','F','S');
//cout<<"S M T W T F S"<<endl;
for (int i=1;i<=w;i++)
{
//cout<<" "<<" ";
printf("\t");
}
for (int i=1;i<=riqi(n,m);i++)
{
//cout<<i;
printf("%d",i);
if (w==6) printf("\n");
else printf("\t");
w=(w+1)%7;
}
return 0;
}