題目內容:判斷一個數是否為對稱且不大於五位數的素數。
輸入描述:輸入數據含有不多於50個的正整數n(0<n<232)。
輸出描述:對於每個n,如果該數是不大於五位數的對稱素數,則輸出“Yes”,否則輸出“No”。每個判斷結果單獨列一行。
題目分析:
(1)判斷它是否是五位以內的數,即該數是否小於100000.
(2)判斷該數是否對稱,以下三種情況成立:該數是一位數或11;該數是三位數,即該數大於100且小於1000,且該數的百位數等於個位數;該數是五位數,即該數大於10000且前兩位等於後兩位的逆序,即該數除以1000的商等於個位數與十位數顛倒位置。因四位數的對稱數不可能是素數,所以不予考慮。
(3)判斷該數是否是素數。首先判斷該數是否是1,若是1則不是素數。然後判斷該數是否是非2的偶數,若是則非素數。最後從3開始,每次加2,直到其平方大於該數,判斷該數對其取余是否為0.若出現取余為0的情況,則該數非素數。
參考代碼:
#include <fstream>
#include <iostream>
using namespace std;
bool isPrime(int n)
{
if(n==1) return false;
if(n!=2&&n%2==0) return false;
for(int i=3;i*i<=n;i=i+2)
{
if(n%i==0) return false;
}
return true;
}
bool isSym(int n)
{
if(n<12&&n!=10) return true;
if(n>100&&n<1000&&n/100==n%10) return true;
if(n>10000&&n/1000==n%10*10+n/10%10) return true;
return false;
}
int main(int argc,char * argv[])
{
int n;
while(cin>>n)
{
cout<<(n<100000&&isSym(n)&&isPrime(n)?"Yes\n":"No\n");
}
system("pause");
return 0;
}
運行結果: