[USACO 1.5.3]特殊的質數肋骨
阿新 • • 發佈:2018-12-08
題目描述
農民約翰母牛總是產生最好的肋骨。你能通過農民約翰和美國農業部標記在每根肋骨上的數字認出它們。農民約翰確定他賣給買方的是真正的質數肋骨,是因為從右邊開始切下肋骨,每次還剩下的肋骨上的數字都組成一個質數,舉例來說: 7 3 3 1 全部肋骨上的數字 7331是質數;三根肋骨 733是質數;二根肋骨 73 是質數;當然,最後一根肋骨 7 也是質數。 7331 被叫做長度 4 的特殊質數。寫一個程式對給定的肋骨的數目 N (1<=N<=8),求出所有的特殊質數。數字1不被看作一個質數。
輸入
單獨的一行包含N。
輸出
按順序輸出長度為 N 的特殊質數,每行一個。
樣例輸入
4
樣例輸出
2333
2339
2393
2399
2939
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393
分析:
本題,採用窮舉,則會超時。所以打表。
`#include"stdio.h"
#include"math.h"
int isprime(long long n)//判斷是否是素數
{ long long i,m;
m=n;
while(m)
{
for(i=2;i<=sqrt(m);i++)
if(m%i==0)
return 0;
if(i>sqrt(m)) { n=n/10; m=n; } else return 0; if(m/10==0) if(m==1) return 0; } if(n==0) return 1; return 0; }
int main()
{
long long n,t,i,j,k,s;
i=0; static long long a[160]; a[0]=0; k=0; while(k<160)//打表,一個純素數的組成為1,3,5,7,9,組成 { j=i; if(isprime(a[j]*10+1)==1) a[++k]=a[j]*10+1; if(isprime(a[j]*10+2)==1) a[++k]=a[j]*10+2; if(isprime(a[j]*10+3)==1) a[++k]=a[j]*10+3; if(isprime(a[j]*10+5)==1) a[++k]=a[j]*10+5; if(isprime(a[j]*10+7)==1) a[++k]=a[j]*10+7; if(isprime(a[j]*10+9)==1) a[++k]=a[j]*10+9; i++; // printf("k=%lld,a[k]=%lld\n",k,a[k]); } while(~scanf("%lld",&n)) { for(i=0;i<160;i++) if(a[i]>pow(10,n-1)&&a[i]<pow(10,n)) printf("%lld\n",a[i]); }
}
`