//某一天后面n天/n月的日期
#include<cstdio>
#include<string>
#include<stdlib.h>
#include <string.h>
#include<iostream>
using namespace std;
int date[3];
int sum[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int day=1244;
bool run(){
if((date[0]%4==0&&date[0]%100!=0)||date[0]%400==0)
return 1;
return 0;
}
bool add(int start){
if(run())sum[1]=29;
else sum[1]=28;
for(int i=start-1;i<12;i++){
if(day-sum[i]>=0){
date[1]++;
day-=sum[i];
if(i==11)return 1;
}
else {
date[2]+=day;
day=0;
break;
}
}
return 0;
}
void solution(){
//增加到下个月的开始
if(day-(sum[date[1]-1]-date[2]+1)>=0){
day-=(sum[date[1]-1]-date[2]+1);
date[2]=1;
if(date[1]==12)date[1]=1;
else date[1]++;
while(add(date[1])){
date[0]++;
date[1]=1;
}
if(day)date[2]+=day;
}
else
date[2]+=day;
}
int main(){
//任意一天是星期几
//2018-3-29 比如这个
char s[]="2017-05-04";//398
//const char *d="-";
char *p=strtok(s,"-");
for(int i=0;i<3;i++){
date[i]=atoi(p);
//printf("%d",date[i]=atoi(p));
p=strtok(NULL,"-");
}
solution();
printf("%d-%d-%d\n",date[0],date[1],date[2]);
return 0;
}
基姆拉尔森计算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1) mod 7
#include<cstdio>
#include<string>
#include<stdlib.h>
#include <string.h>
#include<iostream>
using namespace std;
int date[3];
int main(){
//任意一天是星期几
//2018-3-29 比如这个
while(1){
char s[100];
scanf("%s",s);
char *p=strtok(s,"-");
for(int i=0;i<3;i++){
date[i]=atoi(p);
//printf("%d",date[i]=atoi(p));
p=strtok(NULL,"-");
}
//printf("%d-%d-%d\n",date[0],date[1],date[2]);
int W,y=date[0],m=date[1],d=date[2];
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;
printf("星期%d\n",W);
}
return 0;
}
2018-3-29
星期4