洛谷P1218 特殊的质数肋骨

洛谷P1218 特殊的质数肋骨

题目:

农民约翰的母牛总是产生最好的肋骨。你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。

农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数。

举例来说:7 3 3 1 全部肋骨上的数字 7331 是质数;三根肋骨 733 是质数;二根肋骨 73 是质数;当然,最后一根肋骨 7 也是质数。7331 被叫做长度 4 的特殊质数。

写一个程序对给定的肋骨的数目 n,求出所有的特殊质数。1 不是质数。

解析:

这道题

开头我们需要求出范围

比如如果 n 是 4

那范围就是1000到9999

把这个数的右边每次去掉一位也很简单

除以十就可以了

至于算质数

大家应该都会

就不多说了

下面是重点

前方高能!!!

这道题

你要是这样写

大约只能对一个测试点

其他的超时

所以

要想尽办法

优化

有两个点可以优化:

1、最左边的数必须是质数,否则不需要算,浪费时间

2、算质数的时候不用算到底,算到这个数的平方根就可以了

当你把以上两个点都解决的时候

完美!

代码如下:

#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int ss(int zs)
{
	bool flag=true;
	if(zs%2==0&&zs!=2) return 2;
	if(zs==1) return 2;
	for(int i=2;i<=sqrt(zs); i++)
	{
		
		if(zs%i==0)
		{
			flag=false;
			break;
		}

	}
	if(flag==true) return 1;
	else return 2;
}//算质数
int main()
{
	long long n,z,d,cs;
	bool flag=true;
	cin>>n;
	z=pow(10,n-1);
	//cout<<z<<endl;
	if(n==1)
	{
		cout<<"2"<<endl<<"3"<<endl<<"5"<<endl<<"7"<<endl;
		return 0;
	}//如果n=1,直接输出2、3、5、7
	for(int i=z;i<=z*10-1;i++)
	{
		d=i;
		cs=i;
		flag=true;
		//cout<<d/z<<endl;
		if((((d/z)==2)||((d/z)==3)||((d/z)==5)||((d/z)==7))&&flag==true)//最前面是否是质数
		{
			while(d>=1)
			{
				if(ss(d)==2)
				{
					flag=false;
					break;
				}
				else
				{
					d/=10;
					//flag=true;
				}
			}//判断是否符合条件
			if(flag==true)
			cout<<i<<endl;//输出
	    }
	}
	return 0;
}

在这里插入图片描述

好吧

你会发现

最后一个点过不掉

我也没办法了

不过这道题

数据范围

很小

n=1~8

可以打表

不过这样就

没啥意思了

大神

能帮我改一下

发布了24 篇原创文章 · 获赞 0 · 访问量 618

猜你喜欢

转载自blog.csdn.net/zliang_ma/article/details/104300043
今日推荐