fzu训练赛14 I - Prime Substring

I - Prime Substring
Time Limit:2000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu

Description


Problem I

Prime Substring 
  Time Limit: 
10 seconds

 

 

Given a string of digits, your task is to find the largest prime number which presents in that string. Our prime numbers are values between 2 to 100,000 only.

 

Input

Each line contains a string of digits (255 digits at most). The line contains only 0 indicates the end which will not be processed. The input does not exceed 1,000 lines.

 

Output
           Print out in each line the largest prime number found in each input string.

 

Sample Input

Sample Output

11245 

91321150448

1226406

0

11

1321

2

 题目的意思 给你个整数,让你求这个整数中间最大的那个素数。

分析 可以先打出一个素数表,然后从大到小的顺序来检查是否包括在给出的整数中间。

这里我使用了 strstr()函数,之前没有注意过,现在才发现它的作用。

-------------------------------------------------------------------------------------------------------------------------------

包含文件:string.h
函数名: strstr
函数原型:extern char *strstr(char *str1, char *str2);
功能:从字符串str1中查找是否有字符串str2,如果有,从str1中的str2位置起,返回str1中str2起始位置的指针,如果没有,返回null。
返回值:返回该位置的 指针,如找不到,返回空指针。
例子:
1
2
3
char str[]= "1234 xyz" ;
char * str1= strstr (str, "34" );
cout<<str1<<endl;
显示:    34 xyz
-----------------------------------------------------------------------------------------------------------------------

以上出自百度百科。注意这里strstr()是c的东西,所以string无法实用,改为字符型数组就可以了

#include<iostream>
#include<string>
#include<cmath>
#include<math.h>
#include<stdio.h>
#include<string.h>
using namespace std;
#define MAX 100001
int  flag[MAX];
int b[MAX];
int plen;
void getprime()
{
	int i,j;
	memset(flag,1,sizeof(flag));
	for(i=2;i*i<MAX;i++)
	{
		if(flag[i])
			for(j=i;j*i<MAX;j++)
				flag[i*j]=0;
	}
	j=0;
	for(i=2;i<MAX;i++)
		if(flag[i])
			b[j++]=i;
	plen=j;
}

int main()
{
	int n,i,flag,k,j,m,p;
	char st[100000],sa[100000];
	char c;
	getprime();
	while(cin>>sa&&strcmp(sa,"0")!=0)
	{
		for(i=plen-1;i>=0;i--)/// 注意i=0;
		{
			j=0;
			m=b[i];	
			while(m)
			{
				st[j++]=m%10+'0';
				m=m/10;
			}
			st[j]='\0'; //注意末尾,之前就是忘了写这个,结果输出一大堆没用的东西
			int len=j;
			for(k=len-1,j=0;k>j;k--,j++)
			{ 
				int t=st[j];
				st[j]=st[k];
				st[k]=t;
			}

			if(strstr(sa,st))
			{
				cout<<b[i]<<endl;
				break;
			}
			
		}
		
	}
		
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值