码迷,mamicode.com
首页 > 其他好文 > 详细

PE 49

时间:2020-05-31 00:39:37      阅读:52      评论:0      收藏:0      [点我收藏+]

标签:show   display   font   条件   mil   hid   sort   oid   构造   

题意:1487, 4817, 8147是公差为3330的等差数列,并且三个数都是质数、构成这三个数的数都是一样的。求出另一个满足条件的四位数。

思路:先将4位数的质数找出来,然后分解,重新排列,找到由这几个数构成的所有质数,然后判断是否有满足条件的。可以用vis数组判断这个数是否已经构造过。

技术图片
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const ll maxn=1e7;
int v[maxn];
struct Prime
{
    int prime[maxn];
    int s;
    Prime()
    {
        for(int i=2; i<maxn; i++)
        {
            if(!v[i])
            {
                prime[s++]=i;
                for(int j=2; j*i<maxn; j++)
                    v[i*j]=1;
            }
        }
    }
};
Prime p;
int vis[maxn];
void check(int c)
{
    int a[4];
    int k=0;
    while(c)
    {
        a[k++]=c%10;
        c/=10;
    }
    sort(a,a+4);
    int b[50];
    set<int>st;
    int s=0;
    do
    {
        k=a[0]*1000+a[1]*100+a[2]*10+a[3];
        if(k<1000||v[k])
            continue;
        b[s++]=k;
        vis[k]=1;
        st.insert(k);
    }
    while(next_permutation(a,a+4));
    sort(b,b+s);
    for(int i=0; i<s-2; i++)
        for(int j=i+1; j<s; j++)
        {
            if(v[2*b[j]-b[i]]||!st.count(2*b[j]-b[i]))
                continue;
            cout<<b[i]<<" "<<b[j]<<" "<<2*b[j]-b[i]<<endl;
            return ;
        }
}
int main()
{
    for(ll i=1000; i<9999; i++)
    {
        if(!v[i]&&!vis[i])
            check(i);
    }
    return 0;
}
View Code

 

PE 49

标签:show   display   font   条件   mil   hid   sort   oid   构造   

原文地址:https://www.cnblogs.com/ygxcj/p/12995608.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!