# String Manipulation# Palindrome# Conditional Logic

d535 - 2. 密碼驗證與擷取

🔗 前往 ZeroJudge 原題

題目描述

題目要求驗證輸入的字串是否符合特定規則,如果符合則提取字串中的偶數數字組成密碼。規則包括:字串長度在 10 到 30 之間,僅包含數字 1 到 9,是迴文串,且相鄰數字滿足後面的數字不超過前面數字的兩倍。如果字串不符合規則,輸出 "INCORRECT"。如果字串符合規則但沒有偶數,輸出 "0"。

解題思路

程式首先檢查字串長度是否在有效範圍內。然後,它依次檢查字串是否為迴文串,相鄰數字是否滿足條件,以及是否包含偶數數字。如果所有條件都滿足,程式會遍歷字串,提取偶數數字並輸出。如果字串不符合任何一個條件,程式會輸出 "INCORRECT"。如果字串符合所有條件但沒有偶數,程式會輸出 "0"。

複雜度分析

  • 時間複雜度: O(n),其中 n 是字串的長度。程式需要遍歷字串多次來檢查迴文、相鄰數字的關係以及提取偶數。
  • 空間複雜度: O(1),程式使用的額外空間是常數級別,不隨字串長度變化。

程式碼

#include <iostream>
#include <string>
using namespace std;
int main(){
	string a;
	while(cin >> a){
		if(a.length()<10||a.length()>30)
			cout << "INCORRECT\n";
		else{
			bool ans=0;
			for(int i=a.length()-1;i>=0&&ans==0;i--)
				if(a[i]>'9'||a[i]<'1')
					ans=1;
			for(int i=0;i<a.length()&&ans==0;i++)
				if(a[i]!=a[a.length()-i-1])
					ans=1;
			for(int i=1;i<a.length()&&ans==0;i++)
				if((a[i]-48)>(a[i-1]-48)*2)
					ans=1;
			if(ans==0){
				bool z=0;
				for(int i=0;i<a.length();i++){
					if((a[i]-48)%2==0){
						cout << a[i];
						z=1;
					}
				}
				if(z==0)
					cout << "0";
				cout << "\n";		
			}
			else
				cout << "INCORRECT\n";
		}
	}
}

Discussion