101 找出质数
问题描述 :
明明学习数学已经有一段时间了。一次老师在课上讲了什么叫质数。质数就是大于等于2且只能被1和其本身整除的整数。明明觉得这很简单,以为这很容易掌握,于是就不多做练习。明的爸爸发现了这个问题,他想让明明多做练习,把质数这个知识点掌握牢固。但是,他也知道只是求质数会很无聊,明明一定不愿意多做。于是他想出了一个游戏,这个游戏叫“找出质数”,就是给明明一个数字串,要叫明明在这个数字串中找出一个最大的子串,要求这个子串是一个质数。 但是由于明明还太小,他的计算能力有限,因此明明的爸爸认为,找出长度大于4个字符的质数对明明来说太困难了。于是他降低了要求,只需找出小于10,000的最长的质数子串即可。 例如:有一个数字串为17,最大的子串就应该是17,因为1不是质数,7虽然是质数,但是7的长度只有1,17也是质数,它的长度为2,因此最大的子串就是17。 明明觉得这个游戏很有趣,就高兴地做了起来,明明的爸爸出了很多个数字串,由于数字串太多,所以明明爸爸自己找出最长的子串也要花很多的时间,于是明明的爸爸想让你帮他一个忙,写一个程序,找出数字串中最长的质数子串。
明明爸爸的问题可以归结为:输入一串数字,找出其中最长的不超过4个字符的质数子串。若有多个答案,则找出其中数值最大的一个。
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅一行,每组测试数据为一个数字串,数字串的长度不超过20。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即最长的不超过4个字符的质数子串(测试数据保证这个子串存在);若有多个答案,则输出其中数值最大的一个。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。
输入范例 :
17
121
1113
输出范例 :
17
2
113
思想: 从4个长度开始遍历,找到目标数便停止,注释解释的比较详细。
#include <stdio.h> #include <string.h> #include <math.h> int isZS(int num) //判定质数 { int i; for (i = 2; i <=sqrt(num); i++) { if (num % i == 0) { return 0; } } return num; } int main() { int i, j, k, l; int max = 0; char s[30]; while (scanf("%s", &s) != EOF) { int max = 0; for (i = 4; i > 0; i--) //从四位开始,因为如果四位找到了目标数,那么他一定比低位要大 { if (max != 0) //如果在高位发现符合的目标数,跳出循环 { break; } for (j = 0; j < strlen(s); j++) //从0开始遍历整个数组 { k = j; //k 记录每次的起始位置 l = i; //l 记录当前遍历的长度,受外层循环约束,从4开始 int num = 0; //记录当前的数 while (l != 0) //没达到当前遍历长度的时候继续遍历 { if (s[k] != '\0') // 没达到数组的结束符的时候 { num = num * 10 + s[k] - 48; //整个*10再+当前数字 注意char转int要减去0的asc码 k++; l--; }else{ //如果没达到遍历长度就到达了数组的结束符,那么清空,跳出循环,避免346452 这种情况提前找到了符合目标的数却没有完成整体遍历 找到2而非5 num = 0; break; } } if (isZS(num)) //判定是否是质数,同时更新max { if (max < num) { max = num; } } } } printf("%d\n", max); } }