欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

找规律-双倍的快乐

程序员文章站 2022-05-13 17:43:21
...

题目背景
Mad Jim Jaspers 是一个喜欢质数和对称字符串的男人。当且仅当年份是一个质数,且将月份和日期写成"MMDD"后为对称字符串时,MJJ就能在这一天享受双倍快乐,如:"2003-01-10"时,就是双倍快乐日。
题目描述
现在给你n次询问,问你,从2000-01-01开始,第k个双倍快乐日的日期。

输入输出格式
输入格式:
第一行一个整数n。 接下来n行,每行一个数字k,表示一次询问。
输出格式:
输出共n行,每行输出格式为:“YYYY-MM-DD”。
输入输出样例
输入样例#1:
3
1
23
48
输出样例#1:
2003-01-10
2027-11-11
2063-12-21
说明
1≤n≤10^61≤n≤10
6
保证答案存在,且年份在4位数以内。

这个题一开始没有好好想,上手就是暴力,然后。。。然后。。。我的风扇拼命地转
这个题其实就是找规律,一年之中,只有六天是满足对称的,即01-10、02-20、03-30、10-01、11-11、12-21
年份的话只要用筛法求出来就行了

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+5;
const char l[][10]={"12-21","01-10","02-20","03-30","10-01","11-11"};
int n,k,id=1;
int isprime[10000],prime[10000];

void f()
{
    memset(isprime,0,sizeof isprime);
    memset(prime,0,sizeof prime);
    prime[1]=1;
    for(int i = 2 ; i <= 100 ; i++)
    {
        if(!isprime[i])
        {
            for(int j = i * i ; j < 10000 ; j +=i)
                isprime[j]=1;
        }
    }
    for(int i=2000;i<10000;i++)
        if(!isprime[i]&&i>=2000)
            prime[++prime[0]]=i;
}
int main(void)
{
    f();
    cin>>n;
    while(n--)
    {
        scanf("%d",&k);
        printf("%d-%s\n",(k % 6 == 0 ? prime[k/6] : prime[k/6+1]),l[k%6]);
    }
}

相关标签: 找规律

上一篇: ORA-xxxxx

下一篇: tablespace