HDUOJ 2136 Largest prime factor

xiaoxiao2021-02-28  119

#include <iostream> #include <string> #include <vector> #include <stack> #include <queue> #include <deque> #include <set> #include <map> #include <algorithm> #include <sstream> #include <utility> #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> #include <cctype> #define CLOSE() ios::sync_with_stdio(false) #define CLEAR(a, b) memset(a, b, sizeof(a)) #define IN() freopen("in.txt", "r", stdin) #define OUT() freopen("out.txt", "w", stdout) const int maxn = 1000005; using LL = long long; using UI = unsigned int; using namespace std; //------------------------------------------------------------------------------------------// //真不愧是渣啊,,水题a半天。 //暴力打表法 int a[maxn], b[maxn], c[maxn]; //a,b,c分别用来记录一个数是否为素数,存储素数,记录素数在表中的位置 int main() { int cnt = 1; b[0] = 1; for (LL i = 2; i < maxn; ++i) { if (!a[i]) { b[cnt++] = i; c[i] = cnt - 1; for (LL j = i * i; j < maxn; j += i) a[j] = 1; //i*i会爆int即使改了j由于i*i是由i的类型决定的,所以i也要为LL,比较水的 } } int n; while (scanf("%d", &n) == 1) { int maxfac = 0; int t = sqrt(n) + 1; for (int i = 1; b[i] <= t; i++) { if (n % b[i] == 0) { if(i > maxfac) maxfac = i; while(n % b[i] == 0) n /= b[i]; } } if(n == 1) printf("%d\n", maxfac); else printf("%d\n", c[n]); //若进行了sqrt(n)+1内的循环后仍不唯一,那剩下的必定素数。 } return 0; } //看了下别人的题解,原来直接打表时就可以记录下每个合数的最大素因子啦。 int main() { int cnt = 0; for (int i = 2; i < maxn; ++i) { if (!c[i]) { cnt++; //合数会被重复赋值从而最终记录下最后赋值也就是最大素因子的下表 for (int j = i; j < maxn; j += i) c[j] = cnt; } } int n; while (scanf("%d", &n) == 1) printf("%d\n", c[n]); return 0; } //看了看线性筛法 int main() { int cnt = 1; b[0] = 1; for (LL i = 2; i < maxn; ++i) { if (!a[i]) { b[cnt++] = i; c[i] = cnt - 1; //cout << i << endl; } for (int j = 1; j < cnt && i * b[j] < maxn; ++j) { a[i * b[j]] = 1; //合数 = 他的最小质因子 * 合数 || 质数 * 质数; if (i % b[j] == 0) break; //保证前者 //至于为啥这样就没有遗漏了,,下次再补上理论吧。 } } int n; while (scanf("%d", &n) == 1) { int maxfacn = 0; int t = sqrt(n) + 1; for (int i = 1; b[i] <= t; ++i) { if (n % b[i] == 0) { maxfacn = i; while(n % b[i] == 0) n /= b[i]; } } if (n == 1) printf("%d\n", maxfacn); else printf("%d\n", c[n]); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-62256.html

最新回复(0)