码迷,mamicode.com
首页 > 其他好文 > 详细

USACO 1.5.3 SuperPrime Rib

时间:2015-05-25 21:54:52      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:

  The set of ribs denoted by 7331 is prime; the three ribs 733 are prime; the two ribs 73 are prime, and, of course, the last rib, 7, is prime. The number 7331 is called a superprime of length 4.

Write a program that accepts a number N 1 <=N<=8 of ribs and prints all the superprimes of that length.

The number 1 (by itself) is not a prime number.

  题意是,定义一种数字,例如7331,第一位7是质数,前两位73拿出来也是质数,前三位733也是质数,7331也是质数。

  找出所有n位的并满足以上条件的数字,n<8。

  交了无数次,要么数组越界要么超时。

  想法是这样的,用素数筛找出<100000的所有质数存在数组p中,然后从长度为一位的质数开始寻找特殊质数,保存在b中。当然一位的是2,3,5,7。

  还有两个常量,first是当前长度的特殊质数从b数组的哪一个开始,len是当前长度的特殊质数有多少个。然后 比当前长度多一位的特殊质数 必定是 当前长度特殊质数 乘1or3or7or9,然后通过数组b(保存了小于100000的质数)判断该数是不是素数即可。

 

技术分享
#include<bits/stdc++.h>
using namespace std;

int a[100000]={0};
int b[100000]={2,3,5,7};
int p[100000]={0};
int n;

int prime(int m)
{
    for(int i=1;i<=p[0]&&m>p[i];i++)
    {
        if(m%p[i]==0) return 0;
    }
    return 1;
}

int superprime(int first,int len)
{
    int num=0;
    for(int i=first;i<first+len;i++)
    {
        for(int j=1;j<10;j+=2)
        {
            if(j!=5&&prime(b[i]*10+j))
            {
                b[first+len+num]=b[i]*10+j;
                num++;
            }
        }
    }
    return num;
}

int main()
{
    int first=0,len=4,num=0;
    scanf("%d",&n);
    
    for(int i=2;i*i<100000;i++)
        for(int j=i;a[i]==0&&j*i<100000;j++)
        {
            a[i*j]=1;
        }
        
    for(int i=3;i<100000;i++)
        if(a[i]==0) p[++p[0]]=i;

    for(int i=2;i<=n;i++)
    {
        num=superprime(first,len);
        first=first+len;
        len=num;
    }
    
    for(int i=first;i<num+first;i++)
        printf("%d\n",b[i]);

    return 0;
}
View Code

 

 

USACO 1.5.3 SuperPrime Rib

标签:

原文地址:http://www.cnblogs.com/nanf/p/4528828.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!