# Prime Number# Brute Force# String Manipulation

e795 - p2.質數日

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷給定的日期是否為「質數日」。一個日期被稱為質數日,如果將日期表示為一個整數,以及從該整數中提取出的所有可能的子字串(從左到右),都為質數。

解題思路

程式碼首先定義了一個 isPrime 函數,用於判斷一個整數是否為質數。主函數讀取多組測試案例,對於每個案例,將輸入的日期字串轉換為整數,然後從日期字串的左側開始,提取所有可能的子字串,並判斷這些子字串是否都是質數。如果所有子字串都是質數,則輸出「N is a Prime Day!」,否則輸出「N isn’t a Prime Day!」。

複雜度分析

  • 時間複雜度: O(D * 8 * sqrt(10^8)),其中 D 是測試案例的數量。對於每個日期,需要提取最多 8 個子字串,並且對於每個子字串,需要進行質數判斷,質數判斷的時間複雜度為 O(sqrt(n)),n 最大為 10^8。
  • 空間複雜度: O(1),程式碼只使用了常數級別的額外空間。

程式碼

#include <iostream>
#include <string> 
#include <cmath>
using namespace std;
string s;
bool isPrime(int n){
    int k=sqrt(n);
    for(int i=2;i<=k;i++)
        if(n%i==0)return 0;
    return 1;
}
int main() {
    ios_base::sync_with_stdio(false);cin.tie(NULL);
    int t;
    cin>>t;
    while(t--){
        cin>>s;
        cout << s;
        bool flag=false;
        for(int i=0;i<8;i++){
            int n=0;
            for(int ii=i;ii<8;ii++){
            	n*=10;
            	n+=s[ii]-'0';
			}
			if(isPrime(n)==0){
				flag=1;
				break;
			}
        }
        if(flag)cout<<" isn't a Prime Day! \n";
        else cout<<" is a Prime Day! \n";
    }
}

Discussion