鱼C论坛

 找回密码
 立即注册
查看: 4190|回复: 9

题目69:找出一百万以下的n中使得n/φ(n)取到最大的n

[复制链接]
发表于 2021-2-9 13:42:30 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2021-2-20 20:37 编辑

C++ 12ms
  1. #include<iostream>
  2. #include<vector>
  3. #include<cstring>
  4. using namespace std;



  5. template<size_t size, typename T>
  6. void euler_sieve(bool (&is_prime)[size], vector<T>& primes, T (&phi)[size]) {
  7.     T i, k;
  8.     memset(is_prime, -1, size);
  9.     is_prime[0] = is_prime[1] = 0;

  10.     for (i = 2; i < size; i++) {
  11.         if (is_prime[i]) {
  12.             primes.push_back(i);
  13.             phi[i] = i - 1;
  14.         }

  15.         for (T j : primes) {
  16.             k = i * j;

  17.             if (k >= size) {
  18.                 break;
  19.             }

  20.             is_prime[k] = false;

  21.             if (!(i % j)) {
  22.                 phi[k] = phi[i] * j;
  23.                 break;
  24.             }

  25.             phi[k] = phi[i] * (j - 1);
  26.         }
  27.     }
  28. }



  29. int main() {
  30.     ios::sync_with_stdio(false);

  31.     constexpr unsigned int UPPER_BOUND = 1000000;
  32.     static bool is_prime[UPPER_BOUND];
  33.     static unsigned int phi[UPPER_BOUND];
  34.     vector<unsigned int> primes;
  35.     double max_div = 0, div;
  36.     unsigned int max_n = 0, n;

  37.     euler_sieve(is_prime, primes, phi);


  38.     for (n = 2; n < UPPER_BOUND; n++) {
  39.         div = (double)n / phi[n];

  40.         if (div > max_div) {
  41.             max_div = div;
  42.             max_n = n;
  43.         }
  44.     }


  45.     cout << max_n << endl;
  46.     return 0;
  47. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-7 03:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表