现在的位置: 首页 > 综合 > 正文

hdu 2136 Largest prime factor

2017年11月16日 ⁄ 综合 ⁄ 共 1320字 ⁄ 字号 评论关闭

题目:给一个数n,求它的最大质因数是第几个质数,1的为0,     2,3,5,7...分别为1,2,3,4......

分析:先打表吧1到1000000的质数到找出来放到prime[],在查找一直TLE....哭,参考了别人的思想,开一个数组prime【i】,先把2的倍数,赋值为1,3的倍数赋值为2,5的倍数赋值为3,..........以此类推....为了方便找质数,开一个数组vis【】吧访问过的合数全赋值为1,

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1000100;
int prime[maxn];
int vis[maxn];
int main()
{
	int n,c=0;
	memset(vis,0,sizeof(vis));
	prime[1]=0;
	for(int i=2;i<=maxn;i++)
	{
         if(vis[i]==0)
		 {
			 c++;
			 for(int j=i;j<=maxn;j+=i)
			 {
                prime[j]=c;
				vis[j]=1;
			 }
		 }
	}
	while(scanf("%d",&n)!=EOF)
	{
		printf("%d\n",prime[n]);
	}
	system("pause");
	return 0;
}

把TLE的代码也放这里吧.....希望以后能自己找到更高效的算法

/*
#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;
const int maxn=1000100;
int prime[maxn];
int vis[maxn];
int main()
{
	//筛素数
	int num=1;
	memset(vis,0,sizeof(vis));
	for(int i=2;i<=maxn;i++)
	{
		/*
		int flag=1;
		for(int j=2;j<=(int)sqrt(i+0.5);j++)
		{
			if(i%j==0)
			{
				flag=0;
				break;
			}
		}
		if(flag==1)
		{
			prime[num++]=i;
		}
	}*/
		if(!vis[i])
		{
              prime[num++]=i;
		  for(int j=i*i;j<=maxn;j+=i)
			  vis[j]=1;////????????????
		}
		for(int j=i*2;j<=maxn;j+=i)
			vis[j]=1;
	}
	for(int i=2;i<=maxn;i++)
		if(vis[i]==0)
			prime[num++]=i;
	//***********************
	for(int i=1;i<=100;i++)
	{
		printf("%d ",prime[i]);
		if(i%10==0)
			printf("\n");
	}
	int primesum=num-1;
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		if(n==1)
		{
			printf("0\n");
			continue;
		}
		for(int i=(primesum<n?primesum:n);i>=1;i--)
	    {
		   if(n%prime[i]==0)
		   {
			   printf("%d\n",i);
			   break;
		   }
	    }
	}
	system("pause");
    return 0;
}

抱歉!评论已关闭.