哆啦A夢的口袋(字串問題)

2020-08-10 16:11:51

哆啦A夢的口袋
描述

大家都知道哆啦A夢有一個神奇的口袋,從那個口袋裏可以變出任何東西。不過最近哆啦A夢的口袋裏資源比較緊張,只能變出某些符合條件的東西。具體條件如下:

(1)東西的名字僅由字母(大小寫均可)、數位組成。(僅由字母組成、僅由數位組成或由字母數位共同組成均可。)
(2)如果名字中有數位,則規定連續的數位構成一個正整數,並且所有構成的正整數都必須是素數。例如,11acm23club包含11和23這兩個整數,且都爲素數,所以11acm23club可以被變出。
現在給你一個物品清單,請你判斷上面哪些東西可以被變出,哪些東西不能被變出。

輸入
輸入包含多組測試數據。
每組第一行輸入一個整數n(0<=n<=10),表示東西個數,n=0時,輸入結束。
接下來n行,每行輸入一個字串s,表示東西的名字,字串長度不超過100。裏面包含的所有正整數均在32位元int範圍內,且都大於等於2。

輸出
對於每組輸入,輸出當前這個東西能不能被變出,如果能變出,輸出「Yes」,否則輸出「No」。

輸入樣例 1

2
12acm43club
duolaAmeng
4
1126
acm888club
123acm_club good
13and17
0
輸出樣例 1

No
Yes
No
No
No
Yes
來源

天勤考研演算法練習賽題目-天勤考研演算法練習賽(2)

#include<stdio.h>
#include<string.h>
#include<math.h>
int isprime(int x)
{
    int i;
    if(x==1)return 0;
    else
    {
        for(i=2;i*i<=x;i++)
            if(x%i==0)break;
        if(i*i<=x)return 0;
        else
            return 1;
    }
}
int main()
{
	int n,i,j;
	char str[110];
	while(scanf("%d",&n)!=EOF&&n!=0)
	{
		getchar();  ////getchar可以讀入換行符
		while(n--)
		{
			int flag=1;
			gets(str);
			int len=strlen(str);
			for(i=0;i<len;i++)
			if(!((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')||(str[i]>='0'&&str[i]<='9')))
			{
				flag=0;
				break;  // //存在除字母和數位以外的就退出
                  }
			}
			if(flag!=0)
			{
				for(i=0;i<len;i++)
				{
					int t=0;
					if(str[i]>='0'&&str[i]<='9')
					{
						for(j=i;str[j]>='0'&&str[j]<='9';j++)
						t++;   ////標記數位的位數
					}
					if(t!=0)
					{
						int sum=0;
						int k;
						for(k=t-1;k>=0;k--,i++)
						sum=sum+(str[i]-'0')*pow(10,k);
						if(!isprime(sum))
						{
							flag=0;
							break;
						}
						else i=i+t;  ////防止被計算過的數據再次被遍歷
					}
				}
			}
			if(flag==1)
			printf("Yes\n");
			else
			printf("No\n");
		}
	}
	return 0;
}