#include /n#include /n#include /n/nusing namespace std;/n/nconst int N = 1000010;/n/nint n;/nint primes[N], cnt;/nbool st[N];/n/nint main()/n{/n cin >> n;/n/n for (int i = 2; i * i <= n; i ++ )/n {/n if (!st[i]) primes[cnt ++ ] = i;/n for (int j = 0; primes[j] * i <= n; j ++ )/n {/n st[primes[j] * i] = true;/n if (i % primes[j] == 0) break;/n }/n }/n/n int k = 0;/n while (primes[k] <= n / primes[k])/n {/n k ++ ;/n }/n/n int a = 1, b = 1;/n for (int i = k - 1; i >= 0; i -- )/n {/n int p = primes[i];/n int j = 1;/n while (p <= n)/n {/n j ++ ;/n p *= primes[i];/n }/n j -- ;/n/n if (j > 1)/n {/n while (j -- ) cout << primes[i] << ' ';/n }/n if (j == 1)/n {/n if (a * primes[i] < b * (primes[i] - 1))/n {/n a *= primes[i];/n }/n else b *= primes[i] - 1;/n }/n }/n/n if (a > b) swap(a, b);/n cout << a << ' ' << b << endl;/n/n return 0;/n}/n/n哪错了内容:代码看起来没有明显的错误,但是可能会超时,特别是当输入的 $n$ 很大时。一个优化的方法是,在筛素数时只筛到 $/sqrt{n}$,然后在分解质因数时再用筛出的素数进行分解。另外,在分解质因数时可以用贪心的思想,优先选择大的质因子,这样可以使结果更小。/n

C++ 代码优化:高效求解两个数的最大公约数和最小公倍数

原文地址: https://www.cveoy.top/t/topic/oYKY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录