您的位置:首页 > 其它

NYOJ-520 最大素因子

2014-09-24 19:14 211 查看
这个题基本上就两个知识点, 一个素数筛选法求素数,另一个是求最大公因子, 不过确定最大素数在素数表中的位置时,要用到二分的思想,不然会超时,下面是具体代码的实现;

#include <stdio.h>
#include <stdlib.h>
#define SIZE 1000020
int prime[SIZE];//来保存素数,从下标1开始保存第一个
int temp[SIZE];//这个是用素数筛选法求出的素数
int maxPrimeFactor(int n)//求最大素因子的函数
{
int ans;
for(int i = 2; i * i <= n; i ++)
{
while(n % i == 0)
{
ans = i;//如果能求余, 那么当前的i 就是一个素因子
n /= i;//将n缩小
}
}
if(n > 1)//此时说明n 没有被任何一个素数整除, 最大素因子的当然是他本身
ans = n;
return ans;
}
int main()
{
//    freopen("1.txt", "r", stdin);//利用重定向
//    freopen("2.txt", "w", stdout);
int N;
temp[1] = 1;
for(int i = 0; i < SIZE; i ++)//将整个素数表初始化
temp[i] = i;
for(int i = 2; i * i< SIZE; i ++)
{
if(temp[i] != -1)
{
for(int j = i * i; j < SIZE; j += i)
temp[j] = -1;//如果不是素数就将它标记为-1
}
}
int index = 1;
for(int i = 2; i < SIZE; i ++)
{
if(temp[i] != -1)
prime[index ++] = temp[i];//将素数表中的素数复制到prime数组中
}
while(scanf("%d", &N) != EOF)
{
if(N == 1)//特殊数字,特别对待
{
printf("0\n");
continue;
}
int left = 1, right = index - 1, mid = (left + right) / 2;//利用二分法确定最大素数在素数表prime中位置,如果直接for循环会超时
int maxPrime = maxPrimeFactor(N);
if(maxPrime == prime[right])//此时下标不是从零开始, 所以只有两个元素时,假如要确定后一个的位置,当前这个二分不行,这个特殊情况单独写出来
{
printf("%d\n", right);
continue;
}
while(maxPrime != prime[mid])
{
if(maxPrime > prime[mid])
left = mid;
else
right = mid;
mid = (left + right) / 2;
}
printf("%d\n", mid);//打印下标
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: