1. 程式人生 > >[USACO 1.5.3]特殊的質數肋骨

[USACO 1.5.3]特殊的質數肋骨

題目描述

農民約翰母牛總是產生最好的肋骨。你能通過農民約翰和美國農業部標記在每根肋骨上的數字認出它們。農民約翰確定他賣給買方的是真正的質數肋骨,是因為從右邊開始切下肋骨,每次還剩下的肋骨上的數字都組成一個質數,舉例來說: 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]);

}

}
`