模擬——日期計算器(20180125)
05-20
模擬——日期計算器(20180125)
推薦閱讀:
來自專欄 OJ刷題經驗匯總
模擬——日期計算器(20180125)
《演算法筆記》3.4
題目:
題目描述
有兩個日期,求兩個日期之間的天數,如果兩個日期是連續的我們規定他們之間的天數為兩天。
輸入
有多組數據,每組數據有兩行,分別表示兩個日期,形式為YYYYMMDD
輸出
每組數據輸出一行,即日期差值
樣例輸入
20130101
20130105樣例輸出
5
分析
比較常規的模擬題,但是過程的實現比較繁瑣,很容易寫著寫著失去耐心。
1.如何從數中提取出年月日?
—利用取余還有除法運算,以及int類型除法截斷的特性。 2.如何算天數差? 分情況討論: 1.同年:思路1:利用循環,事先用數組存好每個月對應的天數,再來逐月相加??? 思路2:算好每個日期對應的天數再相減
2.不同年:先算出不同年份之間的天數差,加上天數差後再加上前一年距離年終的天數和年末對應的天數(參考1中的思路2) 3.最後注意初始化變數應為1 4.判斷平閏年是老套路了題解
#include
<bits/stdc++.h>
using
namespace std;
const
int yue1[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};\月份數組
const
int yue2[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};\月份數組
int rizi(int y,int m,int d){
int t=0;
if((y%4==0&&y%100!=0)||(y%400==0))\判斷平閏年
{
for(int i=1;i<=m;i++)
t+=yue2[i];
t+=d;
}
else{
for(int i=1;i<=m;i++)
t+=yue1[i];
t+=d;
}
return t;
}
int main(int argc,
char** argv)
{
int a1,a2;
while(scanf("%d %d",&a1,&a2)!=EOF){
if(a1>a2) swap(a1,a2);
int day=1;
int y1=a1/10000,m1=(a1%10000)/100,d1=a1%100;\提取年月日
int y2=a2/10000,m2=(a2%10000)/100,d2=a2%100;\提取年月日
if(y1==y2){
day+=rizi(y2,m2,d2)-rizi(y1,m1,d1);
cout<<day<<endl;}
else{
for(int i=y1+1;i<y2;i++)\循環加年份,下一年開始到最後之前
{
if((i%4==0&&i%100!=0)||(i%400==0))
day+=366;
else
day+=365;
}
if((y1%4==0&&y1%100!=0)||(y1%400==0)){
day+=366-rizi(y1,m1,d1);
day+=rizi(y2,m2,d2);
}
else{
day+=365-rizi(y1,m1,d1);
day+=rizi(y2,m2,d2);
}
cout<<day<<endl;
}}
return
0;
}
另解(模擬數日子的思路)
#include<bits/stdc++.h>
using
namespace std;
int month [13][2]={
{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},
{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
bool isLeap(int year){
return
(year%4==0&&year%100!=0)||(year%400==0);
}
int main(){
int time1,y1,m1,d1;
int time2,y2,m2,d2;
while(scanf("%d %d",&time1,&time2)!=EOF){
if(time1>time2) swap(time1,time2);
y1=time1/10000,m1=time1%10000/100,d1=time1%100;
y2=time2/10000,m2=time2%10000/100,d2=time2%100;
int ans=1;
while(y1<y2||m1<m2||d1<d2){
d1++;
if(d1==month[m1][isLeap(y1)]+1){
m1++;
d1=1;
}
if(m1==13){
y1++;
m1=1;
}
ans++;
}
cout<<ans<<endl;
}
return
0;
}
總結:
月份計算應注意的問題
1.平年閏年,2月天數: 判斷語句: if((y%4==0&&y%100!=0)||(y%400==0)) 2.大月小月——事先構造常量數組(第一個題解在openjudge上只能得7分,不知道為什麼,求助)
相關題目
http://noi.openjudge.cn/ch0113/25/
推薦閱讀:
※計算機科學中的幾個常見概念
※誰說知乎是逼乎?
※CS224N Lecture2 筆記
※《代碼之髓》讀後感
TAG:計算機科學 |