题目
jc学长最近在做素数题,kd学弟就随便写了多组数,每组有n个数,让找出这些数里面哪一个数有最高的素数因子(所有因子里面是素数并且最大的数,这里的因子包括1和它本身)。素数是没有除数的数,除了1和它本身。数字7是素数,而数字6可以被2和3整除不是素数。为了简单学弟认为1也是素数(实际上1并不是素数你可以假装不知道)
给定n个整数(1<n<=5000),整数d在1-20000范围内,输出拥有最大素因子的数
Input
有多组测试用例,每组用例:
第一行:一个整数n;
第2…n+1行:要测试的序列号d,每行一个
Output
输出具有最大素因子的整数。如果不止有一个,输出最早出现的那一个
Sample Input
4
36
38
40
42
Sample Output
38
方法一
#include <stdio.h>
int main()
{
int su[20005]={0};
su[1]=1;
for(int i=2;i<=20005;i++) //首先筛素数,这里有一点改变
if(su[i]==0)
for(int j=i;j<=20005;j+=i)
su[j]=i; //这一步可以直接看出j的最大素数因子
int n,d,ch;
while(scanf("%d",&n)!=EOF)
{
int max=-1; //每输入一组数据都要更新max的值
for(int i=0;i<n;i++)
{
scanf("%d",&d);
if(su[d]>max)
{
ch=d;
max=su[d];
}
}
printf("%d\n",ch);
}
return 0;
}
方法二
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
struct node //定义结构体,c用来存放输入的数据,d用来存放当前数据的最大素因子
{
int c,d;
}a[5005];
int cmp(node a,node b) //这个用来解决“如果不止有一个,输出最早出现的那一个”
{
if(a.d!=b.d) return a.d<b.d;
}
int main()
{
int su[20005]={0};
for(int i=2;i<=20005;i++) //筛素数
{
if(su[i]==0)
for(int j=i+i;j<=20005;j+=i)
su[j]=1;
}
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i].c);
if(su[a[i].c]==0) //如果输入数据本身就是素数,则它的最大素因子为它自己
{
a[i].d=a[i].c;
continue;
}
for(int j=(a[i].c+1)/2;j>=1;j--) //除以2是因为除本身外最大因子为除以二以后的数
{
if(a[i].c%j==0&&su[j]==0) //判断j是否为他的因子且j是否为素数
{
a[i].d=j;
break;
}
}
}
sort(a,a+n,cmp); //按最大素因子的大小排序
printf("%d\n",a[n-1].c);
}
return 0;
}