华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1748|回复: 5
打印 上一主题 下一主题

P2010 回文日期

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-7-3 16:28:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 。
回复

使用道具 举报

14

主题

106

帖子

317

积分

中级会员

Rank: 3Rank: 3

积分
317
沙发
发表于 2018-7-8 15:33:04 | 只看该作者
代码有些长
  1. #include<iostream>
  2. using namespace std;
  3. int a,b,c,s,i,j,d,e,f,g,k,x1,x2;
  4. bool hw(int x,int y,int z)
  5. {
  6.     int h1,h2,h3,h4,h5,h6,h7,h8;
  7.     h1=x/1000;
  8.     h2=x%1000/100;
  9.     h3=x%100/10;
  10.     h4=x%10;
  11.     h5=y/10;
  12.     h6=y%10;
  13.     h7=z/10;
  14.     h8=z%10;
  15.     if((h1==h8)&&(h2==h7)&&(h3==h6)&&(h4==h5))
  16.         return true;
  17.     else
  18.         return false;
  19. }
  20. int main()
  21. {
  22.     cin>>x1>>x2;
  23.     a=x1/10000;
  24.     b=x1%10000/100;
  25.     c=x1%100;
  26.     d=x2/10000;
  27.     e=x2%10000/100;
  28.     f=x2%100;
  29.     if(x1==x2)
  30.     {
  31.         if(hw(a,b,c))
  32.             cout<<"1";
  33.         else
  34.             cout<<"0";
  35.         return 0;
  36.     }
  37.     else
  38.     {
  39.         for(i=a+1; i<d; i++)
  40.         {
  41.             if(i==9220)
  42.                 s++;
  43.             for(j=1; j<=12; j++)
  44.             {
  45.                 if(j==1)
  46.                     g=31;
  47.                 if(j==3)
  48.                     g=31;
  49.                 if(j==5)
  50.                     g=31;
  51.                 if(j==7)
  52.                     g=31;
  53.                 if(j==8)
  54.                     g=31;
  55.                 if(j==10)
  56.                     g=31;
  57.                 if(j==12)
  58.                     g=31;
  59.                 if(j==4)
  60.                     g=30;
  61.                 if(j==6)
  62.                     g=30;
  63.                 if(j==9)
  64.                     g=30;
  65.                 if(j==11)
  66.                     g=30;
  67.                 if(j==2)
  68.                     g=28;
  69.                 for(k=1; k<=g; k++)
  70.                     if(hw(i,j,k))
  71.                         s++;
  72.             }
  73.         }
  74.         for(j=b+1; j<=12; j++)
  75.         {
  76.             if(j==1)
  77.                 g=31;
  78.             if(j==3)
  79.                 g=31;
  80.             if(j==5)
  81.                 g=31;
  82.             if(j==7)
  83.                 g=31;
  84.             if(j==8)
  85.                 g=31;
  86.             if(j==10)
  87.                 g=31;
  88.             if(j==12)
  89.                 g=31;
  90.             if(j==4)
  91.                 g=30;
  92.             if(j==6)
  93.                 g=30;
  94.             if(j==9)
  95.                 g=30;
  96.             if(j==11)
  97.                 g=30;
  98.             if(j==2)
  99.                 g=28;
  100.             for(k=1; k<=g; k++)
  101.                 if(hw(a,j,k))
  102.                     s++;
  103.         }
  104.         for(j=1; j<b; j++)
  105.         {
  106.             if(j==1)
  107.                 g=31;
  108.             if(j==3)
  109.                 g=31;
  110.             if(j==5)
  111.                 g=31;
  112.             if(j==7)
  113.                 g=31;
  114.             if(j==8)
  115.                 g=31;
  116.             if(j==10)
  117.                 g=31;
  118.             if(j==12)
  119.                 g=31;
  120.             if(j==4)
  121.                 g=30;
  122.             if(j==6)
  123.                 g=30;
  124.             if(j==9)
  125.                 g=30;
  126.             if(j==11)
  127.                 g=30;
  128.             if(j==2)
  129.                 g=28;
  130.             for(k=1; k<=g; k++)
  131.                 if(hw(a,j,k))
  132.                     s++;
  133.         }
  134.         if(b==1)
  135.             g=31;
  136.         if(b==3)
  137.             g=31;
  138.         if(b==5)
  139.             g=31;
  140.         if(b==7)
  141.             g=31;
  142.         if(b==8)
  143.             g=31;
  144.         if(b==10)
  145.             g=31;
  146.         if(b==12)
  147.             g=31;
  148.         if(b==4)
  149.             g=30;
  150.         if(b==6)
  151.             g=30;
  152.         if(b==9)
  153.             g=30;
  154.         if(b==11)
  155.             g=30;
  156.         if(b==2)
  157.             g=28;
  158.         for(k=c; k<=g; k++)
  159.             if(hw(a,b,k))
  160.                 s++;
  161.         for(k=1; k<=f; k++)
  162.             if(hw(a,b,k))
  163.                 s++;
  164.         if(a==9220)
  165.             if(b<=2)
  166.                 s++;
  167.         if(d==9220)
  168.         {
  169.             if(e>=3)
  170.                 s++;
  171.             else if((e==2)&&(f==29))
  172.                 s++;
  173.         }
  174.         cout<<s;
  175.         return 0;
  176.     }
  177. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
板凳
 楼主| 发表于 2018-7-8 15:49:14 来自手机 | 只看该作者
太长了  不文雅 看我的!
  1. #include<iostream>
  2. using namespace std;
  3. int s1,s2;
  4. int x,y,s,i,k,year,month,day;
  5. bool b1,b2,bb1,bb2;
  6. int tzb[]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
  7. int main()
  8. {
  9.     cin>>s1>>s2;
  10.     for (i=s1; i<=s2; i++)
  11.     {

  12.         b1=1;
  13.         y=i;///准备回文
  14.         year=y/10000;
  15.         month=y%10000/100;
  16.         day=y%100;
  17.         bb1=(month<=12 && month>=1);
  18.         bb2=(day>=1 && day<=tzb[month]);
  19.         if (bb1 && bb2)  ///日期合法性判断
  20.         {
  21.             x=0;
  22.             while (y>0)
  23.             {
  24.                 k=y%10;
  25.                 y=y/10;
  26.                 x=10*x+k;
  27.             }
  28.             b2=(x==i);
  29.             if (b1 && b2) s++;
  30.         }
  31.     }
  32.     if (s1<=92200229 && s2>=92200229) s++;  ///唯一一个0229的判断
  33.     cout<<s;
  34.     return 0;
  35. }
复制代码


回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
地板
发表于 2018-7-29 19:28:58 | 只看该作者
本帖最后由 倚窗倾听风吹雨 于 2018-7-29 19:31 编辑
  1. #include<iostream>
  2. using namespace std;
  3. 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;
  4. bool hw(int x)
  5. {
  6.         int a[9],j=0,n=x;
  7.         bool flag;
  8.         while(n>0)
  9.         {
  10.                 a[++j]=n%10;
  11.                 n=n/10;
  12.         ///        cout<<a[j]<<" ";
  13.         }
  14. ///        cout<<endl;
  15.         for(j=1;j<=4;j++)
  16.         if(a[j]!=a[9-j])
  17.         {
  18.                 flag=1;
  19.                 break;
  20.         }
  21.         if(flag==1)return false;
  22.         return true;
  23.         return 0;
  24. }
  25. bool rq(int x)
  26. {
  27.         int month,day,year;
  28.         month=(x/100)%100;
  29.         day=x%100;
  30.         year=x/10000;
  31. ///        cout<<year<<" "<<month<<" "<<day<<endl;
  32.         if(month>=13)return false;
  33.         bool r;
  34.         if(year%4==0)
  35.         {
  36.                 if(year%100==0)
  37.                 {
  38.                         if(year%400==0)r=1;
  39.                         else r=0;
  40.                 }
  41.                 else r=1;
  42.         }
  43.         if(r==1)
  44.         {
  45.                 if(day>mr[month])return false;
  46.         }
  47.         else if(day>mp[month])return false;
  48.         return true;
  49. }
  50. int main()
  51. {
  52.         cin>>date1>>date2;
  53.         ///cout<<endl;
  54.         for(int i=date1;i<=date2;i++)
  55.         {
  56.                 if(rq(i))
  57.                 {
  58.                         if(hw(i))
  59.                         {
  60.                             ans++;
  61.                 ///            cout<<i<<endl;
  62.                     }
  63.                 }
  64.         }
  65.         cout<<ans<<endl;
  66.         return 0;
  67. }
复制代码
回复 支持 反对

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
5#
发表于 2018-8-25 17:04:55 | 只看该作者
  1. #include<iostream>//20000101 20101231
  2. using namespace std;
  3. int date1,date2;
  4. int dt,dt1,dt2;
  5. int dd2[13]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
  6. int dd1[13]= {0,31,29,31,30,31,30,31,31,30,31,30,31};
  7. int month,day,year,t;
  8. int f(int x)
  9. {
  10.     int y=0,k;
  11.     while(x>0)
  12.     {
  13.         k=x%10;
  14.         x/=10;
  15.         y=10*y+k;
  16.     }
  17.     return y;
  18. }
  19. bool run(int y)
  20. {
  21.     bool b1=(y%4==0)&&(y%100!=0);
  22.     bool b2=(y%400==0);
  23.     return b1||b2;
  24. }
  25. int main()
  26. {
  27.     cin>>date1>>date2;
  28.     dt1=date1/10000;
  29.     dt2=date2/10000;
  30.     for(dt=dt1; dt<=dt2; dt++)
  31.     {
  32.         year=dt;
  33.         month=f(dt)/100%100;
  34.         day=f(dt)%100;
  35.         if(run(year))
  36.         {
  37.             if((1<=month&&month<=12)&&(1<=day&&day<=dd1[month]))t++;
  38.         }
  39.         else
  40.         {
  41.             if((1<=month&&month<=12)&&(1<=day&&day<=dd2[month]))t++;
  42.         }
  43.     }
  44.     cout<<t;
  45.     return 0;
  46. }
复制代码
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
6#
 楼主| 发表于 2018-8-26 10:29:48 | 只看该作者
这个题其实没有必要判断闰年,因为0229 对应的9220年 手算都知道是闰年。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 00:39 , Processed in 0.103097 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表