1. 程式人生 > 其它 >Java 序列化 和 反序列化

Java 序列化 和 反序列化

P1217 [USACO1.5]迴文質數 Prime Palindromes

題目描述

因為 151 既是一個質數又是一個迴文數(從左到右和從右到左是看一樣的),所以 151 是迴文質數。

寫一個程式來找出範圍 [a,b] (5 \le a < b \le 100,000,000)[a,b](5a<b100,000,000)( 一億)間的所有迴文質數。

輸入格式

第 1 行: 二個整數 a 和 b .

輸出格式

輸出一個迴文質數的列表,一行一個。

輸入輸出樣例

輸入 #1
5 500
輸出 #1
5
7
11
101
131
151
181
191
313
353
373
383
超時未通過的第一種程式碼:
#include <iostream>
#include <cmath>
using namespace std;
bool  Prime(int x)
{
    if(x<=1) return false;
    for(int i=2;i<=sqrt(x);i++)
    {
        if(x%i==0) return false;
    }
    return true; 
}
bool Palindromes(int x)
{
    int n,m;
    m=0;n=x;
    while(n!=0)
    {
        m
=m*10+n%10; n/=10; } if(m==x) return true; else return false; } int main() { int a,b; cin>>a>>b; for(int i=a;i<=b;i++) { if(Prime(i)&&Palindromes(i)) cout<<i<<endl; } return 0; }
提交結果:

 因為第一種程式碼在a~b中找質數,又在a~b中找回文數,所以迴圈的次數增加,也就導致了上面的執行結果不通過(不通過是因為超時)。

對於上面的程式碼,我們可以進行優化:1.質數從a~b裡找,迴文數在質數裡找;2.迴文數從a~b裡找,質數在迴文數裡找。

如果在質數裡找回文數程式碼是:

#include <iostream>
#include <cmath>
using namespace std;
bool Palindromes(int x)
{
    int n,m;
    m=0;n=x;
    while(n!=0)
    {
        m=m*10+n%10;
        n/=10;
    }
    if(m==x) return true;
    else return false;
}
bool  Prime(int x)
{
    if(x<=1) return false;
    for(int i=2;i<=sqrt(x);i++)
    {
        if(x%i==0) return false;
    }
    Palindromes(x);
}

int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    if(b>=9999999) b=9999999; //最大的迴文質數處理
    if(a%2==0)a++;//從2的倍數+1開始搜尋
    for(int i=a;i<=b;i++)
    {
        if(Prime(i))
        { 
            if(Palindromes(i)!=0) cout<<i<<endl; 
        } 
    }
    return 0;
}

提交結果:

為什麼在質數裡找回文數不通過呢?是因為找質數是用for迴圈1次1次的迴圈,迴圈次數就會很多

 而找回文數用while迴圈次數就會少一些了因為while迴圈的次數並不是1次1次的迴圈,所以要從迴文數裡找質數。

下面是通過的兩種程式碼:

通過的第一種程式碼:
#include <iostream>
#include <cmath>
using namespace std;
bool Palindromes(int x)
{
    int n,m;
    m=0;n=x;
    while(n!=0)
    {
        m=m*10+n%10;
        n/=10;
    }
    if(m==x) return true;
    else return false;
}
bool  Prime(int x)
{
    if(x<=1) return false;
    for(int i=2;i<=sqrt(x);i++)
    {
        if(x%i==0) return false;
    }
    Palindromes(x);
}

int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    if(b>=9999999) b=9999999; //最大的迴文質數處理
    if(a%2==0)a++;//從2的倍數+1開始搜尋
    for(int i=a;i<=b;i++)
    {
        if(Palindromes(i)==0) continue;
        else if(Prime(i)) cout<<i<<endl; 
    }
    return 0;
}

通過的第二種程式碼:
#include<bits/stdc++.h>
using namespace std;
int a,b,s[10];
bool prime(int x)//判斷質數
{
    int i;
    for(i=3;i<=sqrt(x);i++)
        if(x%i==0) return 0;
    return 1;
}
bool huiwen(int x)//判斷迴文
{
    int k,len=0,j;
    while(x!=0)
    {
        len++;
        s[len]=x%10;
        x/=10;
    }
    if(len==1) 
    {
        s[len]=0;
        return 1;
    }
    for(k=1;k<=len/2;k++)
            if(s[k]!=s[len-k+1]) return 0;
    for(k=1;k<=len;k++) s[k]=0;
    return 1;
}
int main()
{
    int i;
    cin>>a>>b;
    if(b>=9999999) b=9999999; //最大的迴文質數處理
    if(a%2==0)a++;//從2的倍數+1開始搜尋
    for(i=a;i<=b;i+=2)//2的倍數不為迴文質數
    {
        if(huiwen(i)==0) continue;
        else if(prime(i)) cout<<i<<endl; 
    }
    return 0;
}
以上這兩種不同的解法,大家可以自行借鑑。