洛谷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
可以打表
不过这样就
没啥意思了
望大神
能帮我改一下