# Number Theory# Prime Number# Reverse

d387 - 10235 - Simply Emirp

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷給定的整數是質數、非質數還是 Emirp。Emirp 定義為一個質數,其反轉後也是質數,且反轉後的數與原數不同。

解題思路

首先,使用埃拉托斯特尼篩法預先計算出 1 到 1000000 之間的質數。然後,對於每個輸入的數字,檢查它是否為質數。如果它是質數,則計算它的反轉數,並檢查反轉數是否也是質數,且與原數不同。根據這些條件,輸出相應的結果。

複雜度分析

  • 時間複雜度: O(N log log N + M),其中 N 是篩法計算質數的上限 (1000000),M 是輸入數字的個數。埃拉托斯特尼篩法的時間複雜度為 O(N log log N),反轉數字和檢查質數的時間複雜度為 O(M)。
  • 空間複雜度: O(N),用於儲存篩法計算出的質數陣列。

程式碼

#include <iostream>
using namespace std;
int c[1000000]={0};
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	for(int i=2;i<=1000;i++)
		for(int j=i*2;j<1000000;j+=i)
			c[j]=1;
	int a;
	while(cin >> a){
		if(c[a]==1)
			cout << a << " is not prime.\n";
		else{
			int b=0,d=a;
			while(d>0){
				b*=10;
				b+=d%10;
				d/=10;
			}
			if(b!=a&&c[b]==0)
				cout << a << " is emirp.\n";
			else
				cout << a << " is prime.\n";
		}
	}
}

Discussion