題目描述
牛牛習慣用8位數字表示乙個日期,其中,前4位代表年份,接下來2位代表月 份,最後2位代表日期。顯然:乙個日期只有一種表示方法,而兩個不同的日期的表 示方法不會相同。
牛牛認為,乙個日期是回文的,當且僅當表示這個日期的8位數字是回文的。現 在,牛牛想知道:在他指定的兩個日期之間包含這兩個日期本身),有多少個真實存 在的日期是回文的。
乙個8位數字是回文的,當且僅當對於所有的i ( 1 <=i<= 8 )從左向右數的第i個 數字和第9-i個數字(即從右向左數的第i個數字)是相同的。
例如:•對於2023年11月19日,用8位數字20161119表示,它不是回文的。
•對於2023年1月2日,用8位數字20100102表示,它是回文的。
•對於2023年10月2日,用8位數字20101002表示,它不是回文的。
每一年中都有12個月份:
其中,1、3、5、7、8、10、12月每個月有31天;4、6、9、11月每個月有30天;而對於2月,閏年時有29天,平年時有28天。
乙個年份是閏年當且僅當它滿足下列兩種情況其中的一種:
1.這個年份是4的整數倍,但不是100的整數倍;
2.這個年份是400的整數倍。
例如:•以下幾個年份都是閏年:2000、2012、2016。
•以下幾個年份是平年:1900、2011、2014。
輸入輸出格式
輸入格式:
輸入包括兩行,每行包括乙個8位數字。
第一行表示牛牛指定的起始日期。
第二行表示牛牛指定的終止日期。
保證date_i和都是真實存在的日期,且年份部分一定為4位數字,且首位數字不為0。
保證date1 —定不晚於date2。
輸出格式:
輸出一行,包含乙個整數,表示在date1和date2之間,有多少個日期是回文的。
輸入輸出樣例
輸入樣例#1:
20110101
20111231
輸出樣例#1:
1 輸入樣例#2:
20000101
20101231
輸出樣例#2:
2 說明
【樣例說明】
對於樣例1,符合條件的日期是20111102。
對於樣例2,符合條件的日期是20011002和20100102。
【子任務】
對於60%的資料,滿足date1 = date2。
這題我是用暴力直接搜,所以只對了六個點,拿了60分,還有四個點超時。
此題我的思路是直接乙個 for 過去,再判斷是否符合回文素數的要求。
**如下:
var x,y,j,i,o,ans:longint;
s:string;
function
pd:boolean;
var year,day,month:longint;
x:string;
begin
pd:=true;
x:=copy(s,1,4);val(x,year);
x:=copy(s,5,2);val(x,month);
x:=copy(s,7,2);val(x,day);
case month of
1,3,5,7,8,10,12:if (day>31)or(day<0) then
begin pd:=false; exit; end;
4,6,9,11:if (day>30)or(day<0) then
begin pd:=false; exit; end;
2:if (year mod
400=0)or(year mod
4=0)and(year mod
100<>0) then
if day>29
then
begin pd:=false; exit; end
else
if day>28
then
begin pd:=false; exit; end;
end;
end;
begin
assign(input,'date.in');
assign(output,'date.out');
reset(input);
rewrite(output);
read(x);
read(y);
for i:=x to y do
begin
str(i,s);
if (copy(s,5,2)>'12')or(copy(s,5,1)='0')and(copy(s,6,1)='0')or(copy(s,7,2)>'31')or(copy(s,7,1)='0')and(copy(s,8,1)='0')or(copy(s,1,1)='0') then
continue;
o:=0;
for j:=1
to length(s)div2do
if s[j]<>s[length(s)-j+1] then
begin o:=1; break; end;
if o=0
then
if pd=true
then inc(ans);
end;
write(ans);
close(input);
close(output);
end.
列舉年分,年份中再列舉月份,再列舉日期,就可以避免沒必要的迴圈。
**如下:
const
a:array[1..12]of longint=(31,28,31,30,31,30,31,31,30,31,30,31);
var s1,s2,s,m,d,i,j,k,ys,ye,ms,me,ds,de:longint;
begin
readln(s1);
readln(s2);
ys:=s1 div
10000;
ye:=s2 div
10000;
ms:=(s1 mod
10000)div
100;
me:=(s2 mod
10000)div
100;
ds:=s1 mod
100;
de:=s2 mod
100;
for i:=ys to ye do
begin
a[2]:=28;
if (i mod
4=0)and(i mod
100<>0)or(i mod
100=0)and(i mod
400=0) then
a[2]:=29;
for j:=1
to12
doif (i=ys)and(j>=ms)or(i=ye)and(j<=me)or(1=1) then
begin
if j<10
then m:=j*10
else m:=(j mod
10*10)+(j div
10);
for k:=1
to a[j] do
if (i=ys)and(j=ms)and(k>=ds)or(i=ye)and(j=me)and(k<=de)or(1=1) then
begin
if k<10
then d:=k*10
else d:=(k mod
10*10)+(k div
10);
if i=d*100+m then
begin inc(s);break; end;
end;
if i=d*100+m then
break;
end;
end;
writeln(s);
close(input);
close(output);
end.
NOIP2016普及組第二題 回文日期
題目描述 牛牛習慣用8位數字表示乙個日期,其中,前4位代表年份,接下來2位代表月 份,最後2位代表日期。顯然 乙個日期只有一種表示方法,而兩個不同的日期的表 示方法不會相同。牛牛認為,乙個日期是回文的,當且僅當表示這個日期的8位數字是回文的。現 在,牛牛想知道 在他指定的兩個日期之間包含這兩個日期本...
NOIP 2016 普及組 海港
題目鏈結 小k是乙個海港的海關工作人員,每天都有許多船隻到達海港,船上通常有很多來自不同國家的乘客。小k對這些到達海港的船隻非常感興趣,他按照時間記錄下了到達海港的每一艘船隻情況 對於第i艘到達的船,他記錄了這艘船到達的時間ti 單位 秒 船上的乘客數ki,以及每名乘客的國籍 xi,1,xi,2,x...
noip2016普及組複賽總結
9點半從紀中出發,大概11點多來到廣州六中。在六中旁邊一家小餐館吃了中餐,那餐廳真心很貴,一盆飯就要20元,我們那桌吃了四 盆.xc 不想買單啦 啦啦啦 然後就來到六中的某個功能室百無聊賴的休息了一會兒,兩點鐘進考場。兩點半 比賽開始,還是先看題.一二兩題太水了,直接開碼,1小時搞定兩題 三點半 仔...