算是2017年正式开始在实验室重拾学习吧 14号下午的题 感觉期末很久没做之后确实更弱了
题解报告本来打算找两道攻克的列表里稍难的题 但是事实确实稍难的都没写出来 暂时就先放一些觉得对自己有帮助的题解
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.
InputEach line will contain one integer n(0 < n < 1000000).
OutputOutput the LPF(n).
这道题的意思是输入一个数字,要求输出这个数字最大的质因数在素数表中的位置(比如1在素数表中数组下标是0;2是1,3是2,4的最大质因数是2而2的位置是1)
这道题用到了埃式筛法,因为用通常的找素数方法来解决这道数据量有1000000的题一定会超时。
1 #include<stdio.h> 2 using namespace std; 3 4 int ss[1000000],flag[1000000]; 5 6 int main() 7 { 8 int i, j = 0, n, x = 0, q, k, p; 9 ss[1] = x; 10 x++; 11 for (i = 2; i < 1000000; i++) 12 { 13 if (flag[i] != -1) 14 { 15 ss[i] = x; 16 x++; 17 n = i; 18 for (j = n + n; j < 1000000; j = j + n) 19 { 20 ss[j] = x-1; 21 flag[j] = -1; 22 } 23 } 24 } 25 while (scanf("%d", &q) != EOF) 26 { 27 printf("%d\n", ss[q]); 28 /*if (ss[q] == -1) 29 { 30 k = q / 2; 31 for (p = k; p >= 2; p--) 32 { 33 if (q%p == 0 && ss[p] != -1) 34 { 35 q = p; 36 break; 37 } 38 } 39 } 40 printf("%d\n", ss[q]); 41 }*/ 42 } 43 }
这里面用到的埃式筛法如下 图片截自网易课程
因为1多数情况都很特殊所以这里也是把1排开来
自行定义1的位置为0 然后位置++ 位置变成1
程序上表示就是定义一个flag数组 数组下标代表数字大小,如果flag不等于-1(这个之后会标记到)
那么这个数字就是质数
然后再把2的倍数全部标记为-1
然后我们继续找下一个数字
3未被标记 所以将3的倍数标记为-1
继续这样下去就可以得到如图的结果 蓝色为质数 红色为合数 这个方法计算上亿个数字内的质数也是很快的 因为它的复杂度很低 带log 不过我暂时还不清楚该如何计算算法的复杂度
而这道题是求一个数的最大质因数的位置
我原本的做法是用埃式筛法打一个表 然后再将输入的数字拿来找最大质因数 在把其直接放进表中找到位置
测试正确但是却超时了
于是改进做法
在埃式筛法的时候 仍旧给合数的数进行flag标记 但是它们的值等于他的一个因数的位置。可以不断覆盖
比如 2是质数 找到2的倍数6 将2在素数表中的位置赋给6对应数组 然后找到3,发现6也是3的倍数 然后再把3在素数表的位置赋给6对应数组 因为找的是最大的质因数位置 所以这样从小到大找最终的结果就是题目所需要的
以上
还有一道题解我准备补上那道并查集加欧拉回路的题
用自己的方法做了几个小时 最终放弃 还是必须要用上并查集找联通