74 找出质数
作者: SunCiHai 时间限制: 10S 章节: 字符串
问题描述 :
明明学习数学已经有一段时间了。一次老师在课上讲了什么叫质数。质数就是大于等于2且只能被1和其本身整除的整数。明明觉得这很简单,以为这很容易掌握,于是就不多做练习。明的爸爸发现了这个问题,他想让明明多做练习,把质数这个知识点掌握牢固。但是,他也知道只是求质数会很无聊,明明一定不愿意多做。于是他想出了一个游戏,这个游戏叫“找出质数”,就是给明明一个数字串,要叫明明在这个数字串中找出一个最大的子串,要求这个子串是一个质数。 但是由于明明还太小,他的计算能力有限,因此明明的爸爸认为,找出长度大于4个字符的质数对明明来说太困难了。于是他降低了要求,只需找出小于10,000的最长的质数子串即可。 例如:有一个数字串为17,最大的子串就应该是17,因为1不是质数,7虽然是质数,但是7的长度只有1,17也是质数,它的长度为2,因此最大的子串就是17。 明明觉得这个游戏很有趣,就高兴地做了起来,明明的爸爸出了很多个数字串,由于数字串太多,所以明明爸爸自己找出最长的子串也要花很多的时间,于是明明的爸爸想让你帮他一个忙,写一个程序,找出数字串中最长的质数子串。
明明爸爸的问题可以归结为:输入一串数字,找出其中最长的不超过4个字符的质数子串。若有多个答案,则找出其中数值最大的一个。
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅一行,每组测试数据为一个数字串,数字串的长度不超过20。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即最长的不超过4个字符的质数子串(测试数据保证这个子串存在);若有多个答案,则输出其中数值最大的一个。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。
输入范例 :
17
121
1113
输出范例 :
17
2
113
解答思路:
这题我选择了打表+遍历。感觉还是处理复杂了,如果大家有更好的思路恳请与我分享!
需要注意的是质数表要开的足够的大,一万以内的质数大概一两千个。其次在find函数(功能为在字符串里搜索子串)里便利条件一开始我写了 i<strlen(a)-len+1,毕竟若子串长度4,就没必要在字符串后三位开始匹配了。但是测试除了错误。是因为例如测试用例121,首先传入函数内的质数是最大的9987,这个长度就出了问题,需要注意。
AC代码
#include <cstdio>
#include <cstring>
void findzhi(int num[])
{
int i=0;
for(int j=9999;j>=2;j--)
{
int flag=1;
for(int k=2;k<j;k++)
{
if(j%k==0)
{
flag=0;
break;
}
}
if(flag==1)
{
num[i++]=j;
}
}
}
int find(char a[],int x)
{
char suba[10];
sprintf(suba,"%d",x);
int len=strlen(suba);
for(int i=0;i<strlen(a);i++)
{
int flag=1;
for(int j=0;j<len;j++)
{
if(suba[j]!=a[i+j])
{
flag=0;
}
}
if(flag==1)
{
return 1;
}
}
return 0;
}
int main(){
int num[2000];
findzhi(num);
char a[30];
while(gets(a))
{
for(int i=0;i<2000;i++)
{
if(find(a,num[i]))
{
printf("%d\n",num[i]);
break;
}
}
}
return 0;
}