把第一次写的题解转到这里来了

算是2017年正式开始在实验室重拾学习吧      14号下午的题   感觉期末很久没做之后确实更弱了

  题解报告本来打算找两道攻克的列表里稍难的题    但是事实确实稍难的都没写出来     暂时就先放一些觉得对自己有帮助的题解

 

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. 

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对应数组   因为找的是最大的质因数位置  所以这样从小到大找最终的结果就是题目所需要的

 

 

以上

 

还有一道题解我准备补上那道并查集加欧拉回路的题

用自己的方法做了几个小时  最终放弃   还是必须要用上并查集找联通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值