2017-5-24
2018-3-25 changed
题目描述
输入N表示年数,算出从1900年1月1日到1900+N-1年12月31日每个月13号为星期几,
输出周6,7,1,2,3,4,5的天数
解答
我是求出每个月距离1900年1月1日的天数然后对7求余即可,注意处理平年和闰年
代码
/*
ID: 18795871
PROG: friday
LANG: C++
*/
#include
#include
#include
using namespace std;
ifstream fin("friday.in");
ofstream fout("friday.out");
int day[2][13] = {31,31,28,31,30,31,30,31,31,30,31,30,0,31,31,29,31,30,31,30,31,31,30,31,30,0};
int r[8];
int res(int n){
if (n%4==0 && n%100!=0 || n%400==0) return 1;
return 0;
}
int main(){
int i,n;
fin>>n;
memset(r,0,sizeof(r));
r[6]=1;
int sum = 12,year = 1900,p;
for (i=1 ;i<=12*n-1 ;i++){
p = res(year);
sum += day[p][i%12];
r[sum%7+1] += 1;
if (i%12 == 0) year += 1;
}
fout<6]<<" "<7]<<" ";
for (i=1; i<=4; i++) fout<" ";
fout<5]<return 0;
}
上面的代码应该是按照月份进行相加,相差的天数每次加一个月的天数那么多。
下面的代码是调用函数计算两个日期之间相差的天数。
/*
ID: 18795871
PROG: friday
LANG: C++
*/
#include
#include
#include
using namespace std;
ifstream fin("friday.in");
ofstream fout("friday.out");
int year[2][1]={365,366};
int day[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 res[7];
int n;
bool isLeap(int year){
if ((year%4==0&&year%100!=0)||(year%400==0)) return true;
return false;
}
int cal(int y,int m,int d){
int i,j,s=0;
for (i=1900;i0];
}
j=isLeap(y);
for (i=0;i1;i++){
s+=day[j][i];
}
s+=(d-1);
return s;
}
int main(){
while (fin>>n){
memset(res,0,sizeof(res));
int sum=0,i,j;
for (i=1900;i<1900+n;i++){
for (j=1;j<=12;j++){
sum=cal(i,j,13);
res[sum%7]++;
}
}
for (i=5;i<7;i++){
fout<" ";
}
for (i=0;i<4;i++){
fout<" ";
}
fout<return 0;
}
又或者是这样。
/*
ID: 18795871
PROG: friday
LANG: C++
*/
#include
#include
#include
using namespace std;
ifstream fin("friday.in");
ofstream fout("friday.out");
int day[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 res[7];
int n;
bool isLeap(int year){
if ((year%4==0&&year%100!=0)||(year%400==0)) return true;
return false;
}
int main(){
while (fin>>n){
memset(res,0,sizeof(res));
int sum=12,i,j,k;
res[5]=1;
for (i=1900;i<1900+n;i++){
k=isLeap(i);
for (j=0;j<12;j++){
sum+=day[k][j];
res[sum%7]++;
}
}
res[sum%7]--;
for (i=5;i<7;i++){
fout<" ";
}
for (i=0;i<4;i++){
fout<" ";
}
fout<return 0;
}
需要注意的是,sum初始化应该为12,res[5]=1,因为我们第一次加的是31,也就是第一个月的天数,所以我们要把1900/1/13周几先计算出来,当然最后要再res[sum%7]–,因为我们十二月份多算了一次。