HDU Largest prime factor && nyoj 520 最大素因子【素数】

来源:互联网 发布:java中缺省是什么意思 编辑:程序博客网 时间:2024/04/19 02:39

最大素因子

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述

GreyAnts最近正在学习数论中的素数,但是现在他遇到了一个难题:给定一个整数n,要求我们求出n的最大素因子的序数,例如:2的序数是1,3的序数是2,5的序数是3,以此类推. 研究数论是需要很大的耐心的,为了惩罚那些没有耐心读完题目的童鞋,我们规定:1的最大素因子序数是0.

输入
有多组测试数据,每一行输入一个数字n.(0<n<=1000000)
输出
在接下来的一行,输出结果.
样例输入
2345
样例输出
1213


不算复杂的一道题,但是暴力超时,就算是先打好表,然后查找最大的素因子,也是会超时,然后也是发现这个很巧妙的思路,学到了新知识!!


超时的代码:

#include<stdio.h>#include<math.h>#define maxn 1000005int x[maxn],n,cnt,num[maxn];void db()//素数表{cnt=1;for(int i=2;i*i<maxn;++i)//{if(!x[i]){x[i]=++cnt;for(int j=i;j*i<maxn;++j){x[i*j]=1;}}}}void slove(){if(n==1){printf("0\n");}for(int i=n;i>1;--i){if(x[i]!=1&&n%i==0){printf("%d\n",x[i]-1);return;}}}int main(){db();while(~scanf("%d",&n)){slove();}return 0;} 


看明白大神的思路之后,也是吓尿了:这样都可以!!也是真醉了,赶紧膜拜膜拜大神!!



一般的思路是在打表的时候,某个素数位置保存的是这个素数的编号,然后其他点的编号是 0 或 1 这样很大程度的浪费了空间和时间,然后如果在每次进行素数筛选的时候,直接把能整除的素数的那个编号全部对应赋上这个编号值,然后这样更新下去,每个位置保存的都是他的最大素因子的编号值!!想不明白就再想!!!


ps:早就感觉打表素数不可能这么简单,原来还可以这么有技巧变形,处理了更多的信息,看来自己还有很远的路要走 啊~~


#include<stdio.h>#include<math.h>#define maxn 1000005int x[maxn],n,cnt;void db(){cnt=1;for(int i=2;i<maxn;++i)//这里需要遍历到最后...{if(!x[i])//是素数的话..{x[i]=cnt++;//给素数编号for(int j=2;j*i<maxn;++j)//处理素数的倍数{x[i*j]=x[i];//记录的是每个数的最大素因子的编号}}}}int main(){db();while(~scanf("%d",&n)){printf("%d\n",x[n]);//直接调用}return 0;} 


hdu 2136

Largest prime factor

Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9232 Accepted Submission(s): 3259


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
12345

Sample Output
01213


同样的题,还是写一块比较好....


/*2016年1月17日15:25 */#include<stdio.h>#include<string.h>const int maxn=1000005;int fac[maxn];void db(){int cnt=0;fac[1]=0;for(int i=2;i<maxn;++i){if(!fac[i]){++cnt;for(int j=1;i*j<maxn;++j){fac[i*j]=cnt;}}}}int main(){int n;db();while(~scanf("%d",&n)){printf("%d\n",fac[n]);}return 0;} 






0 0
原创粉丝点击