华师一附中OI组
标题:
P2010 回文日期
[打印本页]
作者:
admin
时间:
2018-7-3 16:28
标题:
P2010 回文日期
https://www.luogu.org/problemnew/show/P2010
题目描述
在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。
牛牛习惯用 8 位数字表示一个日期,其中,前 4 位代表年份,接下来 2 位代表月 份,最后 2 位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表 示方法不会相同。
牛牛认为,一个日期是回文的,当且仅当表示这个日期的8位数字是回文的。现 在,牛牛想知道:在他指定的两个日期之间包含这两个日期本身),有多少个真实存 在的日期是回文的。
一个 88 位数字是回文的,当且仅当对于所有的 i (1≤i≤8) 从左向右数的第i个 数字和第 9-i 个数字(即从右向左数的第 i 个数字)是相同的。
例如:
•对于2016年11月19日,用 88 位数字 20161119 表示,它不是回文的。
•对于2010年1月2日,用 88 位数字 20100102 表示,它是回文的。
•对于2010年10月2日,用 88 位数字 20101002 表示,它不是回文的。
每一年中都有 12 个月份:
其中, 1,3,5,7,8,10,12月每个月有 3131 天; 4,6,9,11 月每个月有 3030 天;而对于 2 月,闰年时有 29 天,平年时有 28 天。
一个年份是闰年当且仅当它满足下列两种情况其中的一种:
1.这个年份是 4 的整数倍,但不是 100 的整数倍;
2.这个年份是 400 的整数倍。
输入输出格式
输入格式:
两行,每行包括一个 8 位数字。
第一行表示牛牛指定的起始日期。
第二行表示牛牛指定的终止日期。
保证 date_i 和都是真实存在的日期,且年份部分一定为 4 位数字,且首位数字不为 00 。
保证 date1 —定不晚于date2 。
输出格式:
一个整数,表示在 date1 和 date2 之间,有多少个日期是回文的。
输入输出样例
输入样例#1:
20110101
20111231
输出样例#1:
1
输入样例#2:
20000101
20101231
输出样例#2:
2
说明
【样例说明】
对于样例1,符合条件的日期是 20111102。
对于样例2,符合条件的日期是 20011002 和 20100102 。
【子任务】
对于60% 的数据,满足 date1=date2 。
作者:
universehyf
时间:
2018-7-8 15:33
代码有些长
#include<iostream>
using namespace std;
int a,b,c,s,i,j,d,e,f,g,k,x1,x2;
bool hw(int x,int y,int z)
{
int h1,h2,h3,h4,h5,h6,h7,h8;
h1=x/1000;
h2=x%1000/100;
h3=x%100/10;
h4=x%10;
h5=y/10;
h6=y%10;
h7=z/10;
h8=z%10;
if((h1==h8)&&(h2==h7)&&(h3==h6)&&(h4==h5))
return true;
else
return false;
}
int main()
{
cin>>x1>>x2;
a=x1/10000;
b=x1%10000/100;
c=x1%100;
d=x2/10000;
e=x2%10000/100;
f=x2%100;
if(x1==x2)
{
if(hw(a,b,c))
cout<<"1";
else
cout<<"0";
return 0;
}
else
{
for(i=a+1; i<d; i++)
{
if(i==9220)
s++;
for(j=1; j<=12; j++)
{
if(j==1)
g=31;
if(j==3)
g=31;
if(j==5)
g=31;
if(j==7)
g=31;
if(j==8)
g=31;
if(j==10)
g=31;
if(j==12)
g=31;
if(j==4)
g=30;
if(j==6)
g=30;
if(j==9)
g=30;
if(j==11)
g=30;
if(j==2)
g=28;
for(k=1; k<=g; k++)
if(hw(i,j,k))
s++;
}
}
for(j=b+1; j<=12; j++)
{
if(j==1)
g=31;
if(j==3)
g=31;
if(j==5)
g=31;
if(j==7)
g=31;
if(j==8)
g=31;
if(j==10)
g=31;
if(j==12)
g=31;
if(j==4)
g=30;
if(j==6)
g=30;
if(j==9)
g=30;
if(j==11)
g=30;
if(j==2)
g=28;
for(k=1; k<=g; k++)
if(hw(a,j,k))
s++;
}
for(j=1; j<b; j++)
{
if(j==1)
g=31;
if(j==3)
g=31;
if(j==5)
g=31;
if(j==7)
g=31;
if(j==8)
g=31;
if(j==10)
g=31;
if(j==12)
g=31;
if(j==4)
g=30;
if(j==6)
g=30;
if(j==9)
g=30;
if(j==11)
g=30;
if(j==2)
g=28;
for(k=1; k<=g; k++)
if(hw(a,j,k))
s++;
}
if(b==1)
g=31;
if(b==3)
g=31;
if(b==5)
g=31;
if(b==7)
g=31;
if(b==8)
g=31;
if(b==10)
g=31;
if(b==12)
g=31;
if(b==4)
g=30;
if(b==6)
g=30;
if(b==9)
g=30;
if(b==11)
g=30;
if(b==2)
g=28;
for(k=c; k<=g; k++)
if(hw(a,b,k))
s++;
for(k=1; k<=f; k++)
if(hw(a,b,k))
s++;
if(a==9220)
if(b<=2)
s++;
if(d==9220)
{
if(e>=3)
s++;
else if((e==2)&&(f==29))
s++;
}
cout<<s;
return 0;
}
}
复制代码
作者:
admin
时间:
2018-7-8 15:49
太长了 不文雅 看我的!
#include<iostream>
using namespace std;
int s1,s2;
int x,y,s,i,k,year,month,day;
bool b1,b2,bb1,bb2;
int tzb[]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
cin>>s1>>s2;
for (i=s1; i<=s2; i++)
{
b1=1;
y=i;///准备回文
year=y/10000;
month=y%10000/100;
day=y%100;
bb1=(month<=12 && month>=1);
bb2=(day>=1 && day<=tzb[month]);
if (bb1 && bb2) ///日期合法性判断
{
x=0;
while (y>0)
{
k=y%10;
y=y/10;
x=10*x+k;
}
b2=(x==i);
if (b1 && b2) s++;
}
}
if (s1<=92200229 && s2>=92200229) s++; ///唯一一个0229的判断
cout<<s;
return 0;
}
复制代码
作者:
倚窗倾听风吹雨
时间:
2018-7-29 19:28
本帖最后由 倚窗倾听风吹雨 于 2018-7-29 19:31 编辑
#include<iostream>
using namespace std;
int date1,date2,mr[13]={0,31,29,31,30,31,30,31,31,30,31,30,31},mp[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},ans;
bool hw(int x)
{
int a[9],j=0,n=x;
bool flag;
while(n>0)
{
a[++j]=n%10;
n=n/10;
/// cout<<a[j]<<" ";
}
/// cout<<endl;
for(j=1;j<=4;j++)
if(a[j]!=a[9-j])
{
flag=1;
break;
}
if(flag==1)return false;
return true;
return 0;
}
bool rq(int x)
{
int month,day,year;
month=(x/100)%100;
day=x%100;
year=x/10000;
/// cout<<year<<" "<<month<<" "<<day<<endl;
if(month>=13)return false;
bool r;
if(year%4==0)
{
if(year%100==0)
{
if(year%400==0)r=1;
else r=0;
}
else r=1;
}
if(r==1)
{
if(day>mr[month])return false;
}
else if(day>mp[month])return false;
return true;
}
int main()
{
cin>>date1>>date2;
///cout<<endl;
for(int i=date1;i<=date2;i++)
{
if(rq(i))
{
if(hw(i))
{
ans++;
/// cout<<i<<endl;
}
}
}
cout<<ans<<endl;
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-8-25 17:04
#include<iostream>//20000101 20101231
using namespace std;
int date1,date2;
int dt,dt1,dt2;
int dd2[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
int dd1[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31};
int month,day,year,t;
int f(int x)
{
int y=0,k;
while(x>0)
{
k=x%10;
x/=10;
y=10*y+k;
}
return y;
}
bool run(int y)
{
bool b1=(y%4==0)&&(y%100!=0);
bool b2=(y%400==0);
return b1||b2;
}
int main()
{
cin>>date1>>date2;
dt1=date1/10000;
dt2=date2/10000;
for(dt=dt1; dt<=dt2; dt++)
{
year=dt;
month=f(dt)/100%100;
day=f(dt)%100;
if(run(year))
{
if((1<=month&&month<=12)&&(1<=day&&day<=dd1[month]))t++;
}
else
{
if((1<=month&&month<=12)&&(1<=day&&day<=dd2[month]))t++;
}
}
cout<<t;
return 0;
}
复制代码
作者:
admin
时间:
2018-8-26 10:29
这个题其实没有必要判断闰年,因为0229 对应的9220年 手算都知道是闰年。
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2