问题描述 :
明明学习数学已经有一段时间了。一次老师在课上讲了什么叫质数。质数就是大于等于2且只能被1和其本身整除的整数。明明觉得这很简单,以为这很容易掌握,于是就不多做练习。明的爸爸发现了这个问题,他想让明明多做练习,把质数这个知识点掌握牢固。但是,他也知道只是求质数会很无聊,明明一定不愿意多做。于是他想出了一个游戏,这个游戏叫“找出质数”,就是给明明一个数字串,要叫明明在这个数字串中找出一个最大的子串,要求这个子串是一个质数。 但是由于明明还太小,他的计算能力有限,因此明明的爸爸认为,找出长度大于4个字符的质数对明明来说太困难了。于是他降低了要求,只需找出小于10,000的最长的质数子串即可。 例如:有一个数字串为17,最大的子串就应该是17,因为1不是质数,7虽然是质数,但是7的长度只有1,17也是质数,它的长度为2,因此最大的子串就是17。 明明觉得这个游戏很有趣,就高兴地做了起来,明明的爸爸出了很多个数字串,由于数字串太多,所以明明爸爸自己找出最长的子串也要花很多的时间,于是明明的爸爸想让你帮他一个忙,写一个程序,找出数字串中最长的质数子串。
明明爸爸的问题可以归结为:输入一串数字,找出其中最长的不超过4个字符的质数子串。若有多个答案,则找出其中数值最大的一个。
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅一行,每组测试数据为一个数字串,数字串的长度不超过20。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即最长的不超过4个字符的质数子串(测试数据保证这个子串存在);若有多个答案,则输出其中数值最大的一个。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。
输入范例 :
17
121
1113
输出范例 :
17
2
113
完整C++代码
直接将4位数内的质数存起来,然后一一在字符串中进行查找
#include <bits/stdc++.h>
using namespace std;
int s2i(string s) {
stringstream ss;
ss << s;
int num;
ss >> num;
return num;
}
int isPrime(int num) {
if (num == 2) return 1;
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) return 0;
}
return 1;
}
int main()
{
vector<string> vec;
for (int i = 2; i <= 9999; i++) {
if (isPrime(i)) vec.push_back(to_string(i));
}
string s;
while (cin >> s) {
for (int i = vec.size() - 1; i >= 0; i--) {
if (s.find(vec[i]) != -1) {
cout << vec[i] << endl;
break;
}
}
}
return 0;
}
😋欢迎大伙私信或者评论区交流讨论😋