#include<iostream>
using namespace std;
int leap(int a){
if(a%4==0&&a%100!=0||a%400==0){
return 1;//闰年
}
else return 0;//平年
}
int number(int year ,int m,int d){
int a[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}};
int number,i;
if(leap(year)==1){//闰年
for (i=0;i<m-1;i++){
number+=a[1][i];
}
number=number+d;
} else if(leap(year)==0){
for (i=0;i<m-1;i++){//平年
number+=a[0][i];
}
number=number+d;
}
return number;
}
// 根据日期推算星期
int whatday(int year,int mon,int day)
{
int m = mon;
int d = day;
// 根据月份对年份和月份进行调整
if(m <= 2)
{
year -= 1;
m += 12;
}
int c = year / 100; // 取得年份前两位
int y = year % 100; // 取得年份后两位
// 根据泰勒公式计算星期
int w = (int)(c/4) - 2*c + y + (int)(y/4)+ (int)(13*(m+1)/5) + d - 1;
return w%7; // 返回星期几
}
int main(){
int year,month,day,day_sum;
char ch;
cout<<"输入年月日(以/区分):"<<endl;
while(cin>>year>>ch>>month>>ch>>day){
day_sum=number(year,month,day);
cout<<"是一年里的第"<<day_sum<<"天"<<endl;
cout<<"是星期"<<whatday(year, month, day)<<endl;
cout<<"输入年月日:"<<endl;
}
}
另一种做法,原理都是泰勒公式
// whatday.c 根据泰勒公式推算日期对应的星期
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdbool.h>
// 根据日期推算星期
int whatday(int year,int mon,int day)
{
int m = mon;
int d = day;
// 根据月份对年份和月份进行调整
if(m <= 2)
{
year -= 1;
m += 12;
}
int c = year / 100; // 取得年份前两位
int y = year % 100; // 取得年份后两位
// 根据泰勒公式计算星期
int w = (int)(c/4) - 2*c + y + (int)(y/4)
+ (int)(13*(m+1)/5) + d - 1;
return w%7; // 返回星期
}
// 将数字转换成字符串
char* convertday(int w,char* str)
{
if(w<0 || w>6 || NULL == str)
return NULL;
char* days[7];
days[0] = "Sunday";
days[1] = "Monday";
days[2] = "Tuesday";
days[3] = "Wednesday";
days[4] = "Thursday";
days[5] = "Friday";
days[6] = "Saturday";
// 转换
strcpy(str,days[w]);
return str;
}
int main(int argc,char* argv[])
{
// 检查参数
if(argc != 1 && argc != 4)
{
puts("usage: whatday or whatday 2013 1 28");
return 1;
}
int year = 0;
int mon = 0;
int day = 0;
// 根据不同参数,获取日期
if(1 == argc)
{
// 如果只有一个参数,以当前日期作为查询日期
time_t t = time(NULL);
struct tm* cur = localtime(&t);
year = cur->tm_year + 1900; // 年份
mon = cur->tm_mon + 1; // 月份
day = cur->tm_mday; // 日期
}
else if(4 == argc)
{
// 将参数转换成日期
year = atoi(argv[1]);
mon = atoi(argv[2]);
day = atoi(argv[3]);
}
else
{
puts("usage: whatday.exe 1981 9 22");
return 1;
}
// 根据日期计算星期
int w = whatday(year,mon,day);
// w 有可能是负数,转换为正
if(w < 0)
{
w += 7;
}
char daystr[16] = "";
// 将数字表示的星期转换为字符串
if(NULL != convertday(w,daystr))
{
// 输出推算结果
printf("%d-%d-%d is %s.",year,mon,day,daystr);
}
return 0;
}