哆啦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;
}