# Prime Number# String Manipulation# Brute Force

b552 - 3.找質數

🔗 前往 ZeroJudge 原題

題目描述

題目給定一個 10 位數的字串,要求從字串的左邊開始,逐步檢查由左邊開始的子字串是否為質數。如果不是質數,則將下一個數字加到子字串的右邊,繼續檢查。如果找到質數,則輸出該質數,並從下一個數字開始重新檢查。最後輸出找到的質數個數以及所有質數。

解題思路

程式碼從輸入的 10 位數字串開始,使用迴圈逐步建立子字串。對於每個子字串,程式碼檢查它是否為質數。如果子字串是質數,則將其儲存在一個陣列中,並將計數器加一。如果子字串不是質數,則將下一個數字加到子字串的右邊,並繼續檢查。質數判斷使用從 2 到子字串平方根的迴圈進行試除法。最後,程式碼輸出找到的質數個數以及所有質數。

複雜度分析

  • 時間複雜度: O(N * sqrt(M)),其中 N 是輸入字串的長度 (10),M 是子字串的最大可能值 (約 10^10)。因為對於每個位置,最壞情況下需要檢查到 sqrt(M) 的數。
  • 空間複雜度: O(10),因為最多儲存 10 個質數。

程式碼

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	string a;
	while(cin >> a){
		long long int ans=0,ansv[11],tmp=0;
		bool chat=0;
		for(int i=0;i<10;++i,chat=0){
			tmp*=10;
			tmp+=a[i]-48;
			if(tmp==1||tmp==0)
				chat=1;
			else{
				for(int k=2,st=sqrt(tmp);k<=st;++k){
					if(tmp%k==0){
						chat=1;
						break;
					}
				}
			}
			if(chat==0){
				ansv[ans]=tmp;
				++ans;
				tmp=0;
			}
		}
		cout << ans << "\n";
		for(int i=0;i<ans;++i){
			cout << ansv[i] << "\n";
		}
		cout << "\n";
	}
}

Discussion