7-4 第幾天(函式實作)
請撰寫函式,形式引數為表示年月日的三個整數(均為日期合法),回傳這一天是當年的第幾天。
主函式中輸入年份和兩個月日,共五個整數,表示兩個日期,輸出這兩個日期相差多少天。
輸入格式:
Y M1 D1 M2 D2,共5個整數,Y表示年份,M1 D1表示第一個日期的月日,M2 D2表示第二個日期的月日,所有資料保證日期一在前,日期2在后。
輸入樣例:
2021 1 1 1 31
輸出樣例:
30
輸入樣例:
2020 2 1 3 1
輸出樣例:
29
輸入樣例:
2020 1 1 12 31
輸出樣例:
365
輸入樣例:
2021 1 1 12 31
輸出樣例:
364
uj5u.com熱心網友回復:
供參考:#include <stdio.h>
int s[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
int f[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
bool isLeap(int year) //判斷是否為閏年
{
if((year%4==0 && year%100!=0)||(year%400==0))
return 1;
else
return 0;
}
int isLegal(int year,int month,int day) //判斷日期是否合法
{
int j=0;
if(month>0 && month<=12 && day>0 && day<=31){
if(isLeap(year)){
if(day <= s[month-1])j=1;
}
else{
if(day <= f[month-1])j=1;
}
}
return j;
}
int Num(int year, int month, int day) //統計天數
{
int d = day;
if(isLeap(year)){
for(int i=0;i<month-1;i++)
d+=s[i];
}
else{
for(int i=0;i<month-1;i++)
d+=f[i];
}
return d;
}
int main(int argc, char* argv[])
{
int year,month,day,month1,day1;
do{ //判斷輸入的日期是否合法
printf("請輸入正確格式的日期(yyyy-mm-dd):");
scanf("%4d-%2d-%2d",&year,&month,&day);
}while(!isLegal(year,month,day));
printf("該日期是該年的第%d天\n",Num(year,month,day));
printf("請輸入年份和兩個月日(Y M1 D1 M2 D2):");
scanf("%4d %2d %2d %2d %2d",&year,&month,&day,&month1,&day1);
printf("%d\n",Num(year,month1,day1)-Num(year,month,day));
return 0;
}
uj5u.com熱心網友回復:
可參分別計算后相減即可。uj5u.com熱心網友回復:
寫復雜了,首先,題目說了保證日期合法,不用自己判斷了。O(1)演算法(!!!敲黑板!!! 90009同學注意聽講
):
#include <stdio.h>
int o(int y, int m, int d)
{
int y1 = y;
m = (m + 9) % 12, y = y - m / 10;
return y * 365 + y / 4 - y / 100 + y / 400 + (m * 306 + 5) / 10 + d -
y1 * 365 - y1 / 4 + y1 / 100 - y1 / 400 - 31;
}
int main()
{
int y, m1, d1, m2, d2;
scanf("%d%d%d%d%d", &y, &m1, &d1, &m2, &d2);
printf("%d\n", o(y, m2, d2) - o(y, m1, d1));
return 0;
}
uj5u.com熱心網友回復:
偷個懶,友情送個函式
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271661.html
標籤:C++ 語言
上一篇:error #156: expression must have struct or union type
下一篇:大佬們求助
