HDU Largest prime factor(打表)

这道题也是使用打表来做,普通做法会超时,根HDU 七夕节那道题类似,都是用打表去做

题目大意:求一个数的做大质因子,每个正整数都能够以唯一的方式表示成它的质因子的乘积

解析:

定义一个表格数组 flag[MAX],用来储存每个数的最大质因子的所在质数中排的位置

两层循环:
第一层循环遍历数据范围内的全部数据
中间的if判断条件过滤掉所有非质数的数
第二层循环遍历所有质数i的倍数的整数,并更新其最大质因子的位置,由于循环从小到大,最后结果一定是该整数的最大质因子的位置

质数为2 质数为3 质数为5 质数为7
i = 2 i = 3 i = 5 i = 7
num = 1 num = 2 num = 3 num = 4
flag[i * j]

flag[2] = num = 1 flag[3] = num++ = 2 flag[10] = num++ = 3 flag[14] = num++ = 4
flag[4] = num = 1 flag[6] = num++ = 2
flag[6] = num = 1 flag[9] = num++ = 2
flag[8] = num = 1 flag[12] = num++ = 2
flag[10] = num = 1
flag[12] = num = 1
flag[14] = num = 1

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 #define MAX 1000010
 7 static int flag[MAX] = {0};
 8 
 9 
10 void Table()
11 {
12     int num = 1;
13     for (int i = 2; i < MAX; i++)
14     {
15         if (flag[i] == 0)
16         {
17             for (int j = 1; i * j < MAX; j++)
18             {
19                 //每个正整数都能够以唯一的方式表示成它的质因数的乘积
20                 flag[i * j] = num;
21             }
22             num++;
23         }
24     }
25 }
26 
27 int main()
28 {
29     int n;
30     Table();
31     while (scanf("%d", &n) != EOF)
32     {
33         printf("%d\n", flag[n]);
34     }
35     return 0;
36 }

普通做法,超时。。。。。。

 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 #define MAX 1000010
 8 static int a[MAX] = {0};
 9 
10 void Prime()
11 {
12     int num = 0;
13     int flag = 0;
14     for (int i = 2; i < MAX; i++)
15     {
16         flag = 0;
17         int t = (int)sqrt(i * 1.0);
18         for (int j = 2; j <= t; j++)
19         {
20             if (i % j == 0)
21             {
22                 flag = 1;
23                 break;
24             }
25         }
26         if (flag == 0)
27         {
28             num++;
29             a[i] = num;
30 //            cout << i << " == " << num << endl;
31         }
32     }
33 }
34 
35 int main(void)
36 {
37     int n;
38     Prime();
39     while(scanf("%d", &n) != EOF)
40     {
41         if (n == 1)
42         {
43             printf("0\n");
44         }
45         else if (a[n] != 0)
46         {
47             printf("%d\n", a[n]);
48         }
49         else
50         {
51             int t = n / 2;
52             for (int i = t; i > 0; i--)
53             {
54                 if (n % i == 0 && a[i] != 0)
55                 {
56                     printf("%d\n", a[i]);
57                     break;
58                 }
59             }
60         }
61     }
62     return 0;
63 }

 

转载于:https://www.cnblogs.com/changeFeng/p/9341587.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值