HOJ2136 素数,筛选法

Problem Description
Everybody knows any number can be combined by the prime number.
Now, your task is telling me what position of the largest prime factor.
The position of prime 2 is 1, prime 3 is 2, and prime 5 is 3, etc.
Specially, LPF(1) = 0.
Input
Each line will contain one integer n(0 < n < 1000000).
Output
Output the LPF(n).
Sample Input
1
2
3
4
5
Sample Output
0
1
2
1
3

题意:每个数都能由多个素数组成,问组成它最大的素数是素数表里的第几个(规定当输入为1的时候,输出0)

由于给的范围很大,所以最好用素数筛选的方法,主要思想是:组成一个数最大的素数是x,那么组成x的倍数的最大素数也可以暂且是x

举个例子:组成3的最大公因数是3,3在素数表中是第2个,所以我们可以暂且把组成6、9、15····都看作是3,但是我们发现,组成15的最大公因数是5而不是3,其实没关系,因为我们循环到5的时候,会把15的值给覆盖的

废话不多说,上代码:

#include<stdio.h>
#define MAX 1000005
int a[MAX];  //这个数组解释:组成x的最大公因式在素数表中是第a[x]个素数
             //全局变量不赋初值默认为0
void init()
{
	int i,j,k;
	for(i=2,k=1;i<1000000;i++) //k作为说明循环到素数表的第几个素数,每完成一次赋值,k++
	{
		if(a[i]==0)
		{
			a[i]=k;
			for(j=i+i;j<1000000;j+=i)  //暂时把i的倍数都赋值k
			{
				a[j]=k;
			}
			k++;   //完成一次完整赋值,k++
		 } 
	}
}
int main()
{
	int n;
	init();
	while(scanf("%d",&n)!=EOF)
	{
		printf("%d\n",a[n]);
	}
	return 0;
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值