• P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib


    题目描述

    农民约翰的母牛总是产生最好的肋骨。你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数,举例来说: 7 3 3 1 全部肋骨上的数字 7331是质数;三根肋骨 733是质数;二根肋骨 73 是质数;当然,最后一根肋骨 7 也是质数。 7331 被叫做长度 4 的特殊质数。写一个程序对给定的肋骨的数目 N (1<=N<=8),求出所有的特殊质数。数字1不被看作一个质数。

    输入输出格式

    输入格式:

     

    单独的一行包含N。

     

    输出格式:

     

    按顺序输出长度为 N 的特殊质数,每行一个。

     

    输入输出样例

    输入样例#1: 复制
    4
    
    输出样例#1: 复制
    2333
    2339
    2393
    2399
    2939
    3119
    3137
    3733
    3739
    3793
    3797
    5939
    7193
    7331
    7333
    7393
    

    说明

    题目翻译来自NOCOW。

    USACO Training Section 1.5

    刚开始觉得操作一定很复杂,,

    就打了个表,,发现也打不下去。。。

    还是写了,,,

    暴力写法,,,没仔细算,,还以为会超时。。。

    结果还很快,,

    也是,,n最大才是8,,,

    代码: 

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    
    int n,x,s=9;
    int f[1000002]={0,23,29,31,37,53,59,71,73,79},ans[1000002];
    //f数组初始化n==2时的情况。
    
    bool judge(int x)  //筛法判断素数
    {
    	for(int i=2;i*i<=x;++i)
    		if(x%i==0) return 0;
    	return 1;
    }
    
    int main()
    {
    	scanf("%d",&n);
    	if(n==2)  //如果n==2就直接输出f数组了,f数组就相当于是打表了2的情况
    	{
    		for(int i=1;i<=9;++i)
    			printf("%d
    ",f[i]);
    		return 0;
    	}
    	else
    	{
    		for(int t=1;t<=n-2;++t)  //我们往后面添数,要添n-2个数
    		{
    			x=0;  //每次更新ans记录答案的数组,所以要更新数组下标qwq;
    			for(int i=1;i<=s;++i)
    			{
    				f[i]*=10; 
            //把已经求出来的少一位的所有数字乘10,然后通过加法来求得位数更多的答案
                   			if(judge(f[i]+1)) ans[++x]=f[i]+1;
    				if(judge(f[i]+3)) ans[++x]=f[i]+3;
    				if(judge(f[i]+7)) ans[++x]=f[i]+7;
    				if(judge(f[i]+9)) ans[++x]=f[i]+9;
            //可以知道在已知数字情况下只有+1,+3,+7,+9才有可能再次得到一个新素数
    			}
    			s=x; //更新循环次数
    			for(int i=1;i<=s;++i)
    				f[i]=ans[i];
           //把下一次要操作的基数组赋为本次操作的答案数组,在此基础上进行下一次操作
    		}
    		for(int i=1;i<=s;++i)
    			printf("%d
    ",ans[i]);
    		return 0;
    	}
    }            

     如果你不开心,那我就把右边这个帅傻子分享给你吧,   

    你看,他这么好看,那么深情的望着你,你还伤心吗?   

    真的!这照片盯上他五秒钟就想笑了。   

    一切都会过去的。

  • 相关阅读:
    LeetCode 769. Max Chunks To Make Sorted
    LeetCode 845. Longest Mountain in Array
    LeetCode 1059. All Paths from Source Lead to Destination
    1129. Shortest Path with Alternating Colors
    LeetCode 785. Is Graph Bipartite?
    LeetCode 802. Find Eventual Safe States
    LeetCode 1043. Partition Array for Maximum Sum
    LeetCode 841. Keys and Rooms
    LeetCode 1061. Lexicographically Smallest Equivalent String
    LeetCode 1102. Path With Maximum Minimum Value
  • 原文地址:https://www.cnblogs.com/Mary-Sue/p/9765263.html
Copyright © 2020-2023  润新知