男女做爰真人視頻免費網(wǎng)站b2b網(wǎng)站有哪些平臺
前言
今天講講日期問題,所謂日期問題,在藍橋杯中出現(xiàn)眾多,但是解法比較固定。
一般有判斷日期合法性,判斷是否閏年,判斷日期的特殊形式(回文或abababab型等)
目錄
例題?
題2
題三
總結(jié)
先枚舉日期,再根據(jù)題意判斷,而不是先模擬題意進行構(gòu)造日期
判斷日期合法性(月份判斷,日判讀,閏年判斷等)?
從一個八位數(shù)中一次取出年月日
?
例題?
回文日期
題目的本意是在給定date1與date2之間找出所有的回文日期的個數(shù)
對于一個回文日期
對于此題,我們有兩種思路?
①是構(gòu)造回文日期,判斷日期合法性,再計算符合范圍的回文日期的個數(shù)。
②是先從全部枚舉日期,構(gòu)造回文日期,再判斷日期的合法性與找出符合條件日期。
這里判斷日期的合法性指,月份必須要在12月內(nèi),
日必須要在對應(yīng)月份合理的天數(shù),在此還需要判斷是否是閏年。
顯然思路①明顯比較困難,?構(gòu)造回文日期比較難,所以我們采取思路2
所以大致思路如下:
枚舉日期時候,我們只需枚舉年份(從1000到9999)(即前四位)?
?
通過年份構(gòu)造回文日期時,有以下思路?
for(int i=1000;i<=9999;i++){int s=i,x=i;for(int k=0;k<4;k++){s=s*10+x%10;//x模運算是依次取出每一個數(shù)x=x/10;}if(date1<=s && s<=date2 && check(s)){res++;}}
一個例子:?
代碼如下:
#include<cstdio>
int arr[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//月份對應(yīng)天數(shù)
bool check(int date)
{int year=date/10000;int month=date%10000/100;int day=date%100;if(month==0||month>12){return false;}if(day==0||month!=2 && day>arr[month]){return false;}if(month==2)//2月需要特判{int j= year%400==0||year%4==0&&year%100!=0;//是閏年j為1,否則為0if(day>arr[month]+j||day<1){return false;}}return true;
}
int main()
{int date1,date2;scanf("%d%d",&date1,&date2);int res=0;for(int i=1000;i<=9999;i++){int s=i,x=i;for(int k=0;k<4;k++){s=s*10+x%10;x=x/10;} //此時s為回文日期if(date1<=s && s<=date2 && check(s)){res++;}}printf("%d",res);
}
?
題2
回文日期2
題目本意是給出一個日期,尋找下一個回文日期和ABABBABA型的日期
我們分析ABABBABA型有特殊性,它也是回文日期,
這樣我們在回文日期種在判斷它是否是ABABBABA型即可。
對于判讀ABABBABA型,?有以下條件:
它的個位數(shù)與十位數(shù)不相等,個位數(shù)與百位數(shù)相等,十位數(shù)與千位數(shù)相等。
?
代碼如下:
#include<cstdio>
int arr[]={0,31,28,31,30,31,30,31,31,30,31,30,31};bool check(int i)//判斷日期合法性
{int year=i/10000,month=i%10000/100,day=i%100;if(month==0||month>12){return false;}if(month!=2 && day>arr[month]||day==0){return false;}if(month==2){int j=year%400==0||year%4==0&&year%100!=0;if(day>arr[month]+j||day==0){return false;}}return true;
}
int main()
{int n;scanf("%d",&n);int acc=0,abb=0;//判斷是否第一次出現(xiàn)回文日期和ABABBABA式日期for(int i=n/10000;;i++)//要一直循環(huán){int x=i,j=i;for(int k=0;k<=3;k++){x=x*10+j%10;j=j/10;}//x為構(gòu)造后的回文日期if(check(x)&&x>n)//判讀日期合法性,判斷日期大于給定日期{if(acc!=1){printf("%d\n",x);acc=1;}//第一次輸出回文日期int num1 = x%10, num2 = x/10%10, num3=x/100%10, num4=x/1000%10;//分別取個,十,百,千位數(shù)if(abb!=1&&num2!=num1&&num1==num3&&num2==num4)//判斷ABABBABA{printf("%d\n",x);abb=1;}if(acc==1&&abb==1){break;}//找完跳出循環(huán)}if(acc==1&&abb==1){break;}}
}
?
題三
日期問題(困難)?
?
例如:
輸入:? ?02/03/04
輸出:2002-03-04
? ? ? ? ? ?2003-02-03
? ? ? ? ? ?2004-03-04?
本題:對于輸入而言,有三種情況:年/月/日,日/月/年/,月/日/年?
本題中如果對給出的輸入模擬出可能出現(xiàn)的日期比較困難,不妨采取先枚舉所有日期,
判斷日期合法性,然后判斷這些日期是否在給定輸入的可能值里面。
代碼如下
#include<cstdio>int arr[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int year,int month,int day)
{if(year<1960||year>2059)return false;if(month<1||month>12)return false;if(month!=2){if(day>arr[month]||day<1) return false;} else {int leap= year%4==0&&year%100!=0 || year%400==0;//閏年leap為1;if(day>arr[month]+leap||day<1){return false;}}return true;
}
int main()
{int a,b,c;scanf("%d/%d/%d",&a,&b,&c);for(int i=19600101;i<=20591231;i++)//枚舉所有日期{int year=i/10000,month=i%10000/100, day=i%100;//取出年月日if(check(year,month,day))//判斷日期合法性{int yea=year%100;//取出年份的后兩位 if(yea==a&&month==b&&day==c||yea==c&&month==a&&day==b||yea==c&&month==b&&day==a)//判斷可能的值{printf("%d-%02d-%02d\n",year,month,day);//格式化輸入}}}return 0;
}
注意這里輸出與輸入
··scanf ("%d /%d/ %d",&a ,&b ,&c);? ? ?//過濾掉輸入的? ?/
··printf ("%d-%02d-%02d\n" , year,month,day);? ? //%02d意為輸出兩位,不足兩位補上前導(dǎo)0
?
總結(jié)
這三到題都有很大的相似性
-
先枚舉日期,再根據(jù)題意判斷,而不是先模擬題意進行構(gòu)造日期
-
判斷日期合法性(月份判斷,日判讀,閏年判斷等)?
bool check(int date)//一個八位的日期包含年月日
{int year=date/10000; //取出年int month=date%10000/100; //取出月int day=date%100; //取出日if(month==0||month>12){return false;}if(day==0||month!=2 && day>arr[month]){return false;}if(month==2)//2月需要特判{int j= year%400==0||year%4==0&&year%100!=0;//是閏年j為1,否則為0if(day>arr[month]+j||day<1){return false;}}return true;//其他為合法日期,返回真
}
-
從一個八位數(shù)中一次取出年月日
例如20201018------取2020年取10月取18 日
其中有公式?運算:? ? ?
%10^n? ························取出一個數(shù)的后n位
/?10^n? ? ························取出一個數(shù)的前n位
//date為一個八位數(shù)
int year=date/10000; //取出年
int month=date%10000/100; //取出月
int day=date%100; //取出日
? ? ? ? ? ? ? ? ? ?
本篇博客到此結(jié)束,謝謝大家觀看,如果各位博友們有好的建議或好的想法,
歡迎留言喔,謝謝大家!?
?