进阶题74 找出质数

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

/*
思路:找出最大的质数即可且长度小于等于4(字符串)
*/
/*
思路:找出最大的质数即可且长度小于等于4(字符串)
*/
#include <stdio.h>
int primenumber(int s){
	if (s == 1)
		return 0;
	int i;
	for (i = 2; i <= s / 2;i++)
	if (s%i == 0)
		return 0;
	if (i > s / 2)
		return 1;
}
void sort(int number[], int len){
	int i, j;
	for (i = 0; i < len;i++)
	for (j = 0; j < len - i - 1;j++)
	if (number[j] < number[j + 1]){
		int temp = number[j];
		number[j] = number[j + 1];
		number[j + 1] = temp;
	}
}
int length(int number){//最长子串小于等于4
	int len = 0;
	while (number){
		len++;
		number /= 10;
	}
	if (len <= 4)
		return 1;
	return 0;
}
int main(){
	char number[10];
	while (scanf("%s", number) != EOF){
		int max[30];
		int count = 0;
		int n = 0;//数字长度
		int i,j;
		while (number[n] != '\0')
			n++;
		for (i = 0; i<n; i++)
		{
			if (primenumber(number[i]-'0'))//字符转换为数字
				max[count++] = number[i]-'0';//存储个位数
		}
		for (i = 0; i<n; i++){//OJ题要时常注意总结(有些代码通用的)
			int temp = number[i]-'0';
			for (j = i + 1; j<n; j++){
				temp = temp*10+ (number[j]-'0');//求和
				if (primenumber(temp))
					max[count++] = temp;
			}
		}
		sort(max,count);
		for (i = 0; i < count; i++){
			if (length(max[i]))
			{
				printf("%d\n", max[i]);
				break;
			}
		}
	}
	return 0;
}

注:以为质数题比较简单,结果还是花了点时间才AC(不能轻敌啊)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值