第十三届蓝桥杯C++研究生组 质因数个数 知识点:试除法分解质因数

137 阅读2分钟

4658. 质因数个数 - AcWing题库

证明i为什么一定是质数

证明一下循环里面的 i 一定是一个质数:假如 i 是一个合数,那么它一定可以分解成多个质因子相乘的形式,这多个质因子同时也是 a 的质因子且比 i 要小(i是a的质因数,a就一定是i的倍数,同时a也一定是i的质因数的倍数),而比 i 小的数在之前的循环过程中一定是被条件除完了的,所以 i 不可能是合数,只可能是质数。

证明循环结束时为什么n一定大于1

首先质数的定义是指在大于1的自然数当中,除了1和它本身之外没有其他任何因数,然后每个数有且仅有一个大于根号n的因子(因为有两个的话相乘就矛盾了)所以当对于小于根号n的所有质因数都循环完的话,必定会剩下1和唯一那个大于根号n的质因子,因为它是质数,所以只需要特判它大于1就好了

如何分解质因数的?

首先 任何一个合数是可以都分解成多个质数相乘的,如14可以分解为2 * 7其中2和7都是质数,再然后 24可以分解为 24= 2 * 2 * 2* 3

_可以发现一个规律就是如果一个数字从2开始进行整除 _即做如下操作 i=2(24/2=12;12/2=6; 6/2=3; 3/2结果不为一个整数 i++;3/3=1; 发现得到了两个质数,这两个质数就叫做质因数按照这个规律就可以得到关于质因数的方法;

#include<bits/stdc++.h>
using namespace std;
#define int long long
int res=0;
void divide(int n)
{
    

    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0) //i一定是质数
        {       
            res++;    //统计质因数的个数
            while(n%i==0)  
            {
                n/=i;      //把i除尽
        
            }
                
        }
    }
    if(n>1)res++;  //唯一大于根号n的那个质因数
}
signed main()
{
    cin.tie(nullptr)->sync_with_stdio(false);
    int n;cin>>n;
    divide(n);
    
    cout<<res<<endl;
    return 0;
}