回文日期

链接:https://ac.nowcoder.com/acm/contest/216/A
来源:牛客网
 

题目描述

众所周知,小K是nowcoder的暴政苟管理,所以小K很擅长踢树,虽然本题与踢树无关

小K喜欢将日期排列成yyyy-mm-dd的形式(位数不足添零补齐)的形式,虽然这与小K只会做回文字符串这道水题无关,但小K觉得日期组成的回文串也是挺可爱的。作为一个凉心出题人,小K决定给你一个可爱的问题:给你两个日期,求这两个日期的闭区间内有多少个回文的日期(输入可能包含多组数据)

输入描述:

第一行包含一个整数T,表示有T组数据

接下来T行,每行两个“yyyy-mm-dd"形式的日期

输出描述:

输出共T行,每行输出当前数据的回文日期的个数

 

示例1

输入

复制

1
1926-08-16
2333-12-21

输出

复制

36

*******

学习到了格式化输入

 scanf("%d-%d-%d",&x1,&y1,&z1);  竟然可以输入1928-08-26(前导0的数并保存)

题解就是枚举天数

但是往出抽年月日的时候,特别智障用for跑了年月日抽的每一位,导致超时三发...

其实可以直接O(1)用表达式求出来

	                int  str[10];
			str[0]=x1/1000;
			str[1]=x1/100%10;
			str[2]=x1/10%10;
			str[3]=x1%10;
			str[4]=y1/10;
			str[5]=y1%10;
			str[6]=z1/10;
			str[7]=z1%10; 
			if(str[0]==str[7]&&str[1]==str[6]&&str[2]==str[5]&&str[3]==str[4])
	                         sum++;
			

代码:

#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<sstream>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1000;
int main(){
	int T;
	cin>>T;

    int x1=0,y1=0,z1=0;
	int x2=0,y2=0,z2=0;

	int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 
	while(T--){
        scanf("%d-%d-%d",&x1,&y1,&z1);
        scanf("%d-%d-%d",&x2,&y2,&z2);

	    int sum=0;
	    int k;
		while(1){
					  
			if((x1%4==0&&x1%100!=0)||(x1%400==0)){
				arr[2]=29;
			}
			else 
			    arr[2]=28;

			if(z1>arr[y1]){
				z1=1;
				y1++;
			}
			if(y1>12){
				x1++;
				y1=1;
			}	
			int  str[10];
			str[0]=x1/1000;
			str[1]=x1/100%10;
			str[2]=x1/10%10;
			str[3]=x1%10;
			str[4]=y1/10;
			str[5]=y1%10;
			str[6]=z1/10;
			str[7]=z1%10; 
			if(str[0]==str[7]&&str[1]==str[6]&&str[2]==str[5]&&str[3]==str[4])
	            sum++;
		           
            
            if(x1==x2&&y1==y2&&z1==z2)
			  break;
		
			  		  
			z1++;			
			
		}

		cout<<sum<<endl;		
	}
	return 0;

} 

以下代码被评论的一个朋友hack了 这组数据 1111-11-12  1111-11-12

牛客判题也水??

但是同学又给我一个核心代码五行的方法。。。。。。

枚举日和月,在组成的数(就是年)判断是否在给定的闭区间内

#include <bits/stdc++.h>
using namespace std;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 
int main(){
	int t;
	scanf("%d", &t);
	while(t--){
		int ans = 0, y1, m1, d1, y2, m2, d2;
		scanf("%d-%d-%d", &y1, &m1, &d1);
		scanf("%d-%d-%d", &y2, &m2, &d2);
		
		for(int i = 1; i < 13; i++){
			for(int j = 1; j <= a[i]; j++){
				int q = j%10*1000 + j/10*100 + i%10*10 + i/10;
				if(q >= y1 && q <= y2){
					ans++;
				} 
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值