程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 1431 素數回文

HDU 1431 素數回文

編輯:C++入門知識

HDU 1431 素數回文


有人問我這個問題。

個人感覺暴搜會TLE O(n*sqrt(n))。n=100000000;(判斷素數用2~sqrt(n)+1 去除)


還是枚舉好了。枚舉 1~10000,把他每一位存下來,回文數已知 left ,求 right ,然後組合起來。


例如 1 ,判斷 11 是否素數。

例如 10 ,判斷 101 是否素數, 判斷 1001 是否素數。


這樣復雜度就是 O(n^2)。 開始我 bool pa[100000000] 准備用標記來確定。結果MLE。


然後算了一下 總共有多少個數,最多 781 個。 int pa[1000] 就可以裝下了。

G++ 15ms


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define INF 0x7fffffff
#define eps 1e-8
#define LL long long
#define PI 3.141592654
#define CLR(a,b) memset(a,b,sizeof(a))
#define FOR(i,a,b) for(int i=a;i=b;i--)
#define pb push_back
#define mp make_pair
#define ft first
#define sd second
#define sf scanf
#define pf printf
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(),(v).end()
#define acfun std::ios::sync_with_stdio(false)

#define SIZE 100000000 +1
using namespace std;

int pa[1000];
int cot;
bool prime(int n)
{
    FOR(i,2,sqrt(n)+2)
        if(n%i==0)return 0;
    return 1;
}

void PA()
{
    cot=0;
    pa[cot++]=2;
    pa[cot++]=3;
    pa[cot++]=5;
    pa[cot++]=7;
    FOR(i,1,10000)
    {
        int num[5];
        int len=0;
        int m=i;
        while(m)
        {
            int tmp=m%10;
            num[len++]=tmp;
            m/=10;
        }
        int ans=i;
        if(len>1)
        {
            FOR(r,1,len)
                ans=ans*10+num[r];
            if(prime(ans))
                pa[cot++]=ans;
        }
        ans=i;
        FOR(r,0,len)
            ans=ans*10+num[r];
        if(prime(ans))
            pa[cot++]=ans;
    }
}

int main()
{
    PA();
    int a,b;
    while(~sf("%d%d",&a,&b))
    {
        FOR(i,0,cot)
        if(pa[i]>=a&&pa[i]<=b)pf("%d\n",pa[i]);
        pf("\n");
    }
}




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved