4 条题解

  • 2
    @ 2023-10-27 18:59:13

    这是20\color {red} 20

    这里有很明显的思路错误,如果nn %i==0 i == 0是应该返回falsefalse,判断到最后才返回truetrue

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    bool isprime(ll n)
    {
        if (n == 2)
            return true;
        for (int i = 2; i <= sqrt(n); i++)
            if (n % i == 0)
                return true;
        return false;
    }
    int main()
    {
        ll n, a[2000005], cnt = 0;
        cin >> n;
        for (int i = 2; i <= n; i++)
        {
            if (n % i == 0 && isprime(n) && isprime(n / i))
            {
                a[++cnt] = i;
                a[++cnt] = n / i;
            }
        }
        sort(a + 1, a + cnt + 1);
        cout << a[cnt];
        return 0;
    }
    

    这是我60\color {yellow} 60分的暴力:

    这里ii22~nn,最后还跑了一遍以求最大值,所以超时了

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    ll n, a[2000005], cnt = 0;
    bool isprime(ll n)
    {
        if (n == 2)
            return true;
        for (int i = 2; i <= sqrt(n); i++)
            if (n % i == 0)
                return false;
        return true;
    }
    int main()
    {
        cin >> n;
        for (int i = 2; i <= n; i++)
        {
            if (n % i == 0 && isprime(i) && isprime(n / i))
            {
                a[++cnt] = i;
                a[++cnt] = n / i;
            }
        }
        ll ans = -1;
        for (int i = 1; i <= cnt; i++)
        {
            ans = max(ans, a[i]);
        }
        cout << ans;
        return 0;
    }
    

    这是优化后100\color{green} 100分的暴力:

    因为只要求出nn一半的因数,另一半就可以用n / in ~/ ~i 的结果来算出来啦!于是就能AC此题了!

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #define ll long long
    using namespace std;
    ll n, a[2000005], cnt = 0;
    bool isprime(ll n)
    {
        if (n == 2)
            return true;
        for (int i = 2; i <= sqrt(n); i++)
            if (n % i == 0)
                return false;
        return true;
    }
    int main()
    {
        scanf("%lld", &n);
        for (int i = 1; i <= sqrt(n); i++)
        {
            if (n % i == 0 && isprime(i) && isprime(n / i))
            {
                a[++cnt] = i;
                a[++cnt] = n / i;
            }
        }
        sort(a + 1, a + cnt + 1);
        printf("%lld", a[cnt]);
        return 0;
    }
    

    这是正解的ACAC CodeCode

    这份AC代码是我一步步试出来的,如果在考场我肯定也会用奥利给哥的思路

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    ll ans = 1e9;
    int main()
    {
        ll n;
        cin >> n;
        for (int i = 1; i <= sqrt(n); i++)
        {
            if (n % i == 0)
            {
    			ans = min(ans, n / i);
            }
        }
        cout << ans;
        return 0;
    }
    
    • 1
      @ 2022-12-26 16:00:34

      思路

      这题是一个十分简单的数学问题,可以把质因数(只因数)从2到n的平方根寻找,如果发现一个数能刚好被n整除,输出大的那个(用n除以那个数)。

      AC代码

      #include <bits/stdc++.h>
      using namespace std;
      int main()
      {
          int n;
          cin >> n; //输入
          for (int i = 2; i <= sqrt(n); i++)
              if (n % i == 0) //素数的判断
      			cout << n / i; //输出较大的质数
          return 0;
      }
      
      • 0
        @ 2024-5-7 22:22:42
        #include <bits/stdc++.h>
        using namespace std;
        long long n;
        void show(long long x){
        	map<int,int>m;
        	for (int i=2;i*i<=x;i++){
        		while (x%i==0){
        			m[i]++;
        			x/=i;
        		}
        	}
        	if (x>1)m[x]++;
        	vector<int>v;
        	for (const auto&it:m)v.push_back(it.first);
        	cout<<max(v[0],v[1]);
        }
        int main(){
        	cin>>n;
        	show(n);
        	return 0;
        }
        
        • 0
          @ 2022-7-26 22:24:44
          #include <iostream>
          #include <algorithm>
          using namespace std;
          bool is_prime(int n) {                          //常用的质数判断程序
          	if(n <= 1) {
          		return false;
          	}
          	for(int i = 2; i * i <= n; i++) {
          		if(n % i == 0) {
          			return false;
          		}
          	}
          	return true;
          }
          int n, maxn = 0;
          int main() {
          	cin >> n;                                   //输入
          	for(int i = 1; i * i <= n; i++) {           //如果i是n的因数,呢么n/i绝对也是n的因数
          		if(n % i == 0 && is_prime(i)) {
          			maxn = max(maxn, i);                //求原来的最大值和i的较大数
          			if(is_prime(n / i)) {               //判断n/i是否为质数
          				maxn = max(maxn, n / i);        //求原来的最大值和n/i的较大数
          			}
          		}
          	}
          	cout << maxn << endl;                       //输出
          	return 0;
          }
          /*
          因为只要求出了n的一半的因数,另一半就能用这个因数求出
          n = 9时
          n / 2 约等于 4
          9 / 1 == 0:
              9 / 1 = 9
              所以1时9的因数,9也是9的因数
          9 / 2 == 1
          9 / 3 == 0:
              9 / 3 = 3
              因为3 = 3所以只用记录1个3
          
          9的因数有1  3  9
          */
          • @ 2023-10-20 19:47:14

            6,都说了是两个质数的乘积,还有个这么复杂吗?

        • 1

        [入门][NOIP2012 普及组] 质因数分解

        信息

        ID
        1492
        时间
        1000ms
        内存
        256MiB
        难度
        6
        标签
        递交数
        651
        已通过
        194
        上传者