这道题也是使用打表来做,普通做法会超时,根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 }