分解质因数

分解质因式

数学定理:根据算术基本定理,不考虑排列顺序的情况下,每个正整数都能够以唯一的方式表示成它的质因数的乘积。

即:任何一个数都可以写成 N=Pp1a1+Pp2a2++ppkak 其中P为质数

故我们引伸出分解质因数的算法:

原理:我们从第一个质因数开始枚举到n 如果其能整除,则说明它是n的一个它是N的一个因子。

但,也许有些人会疑惑它这样子枚举不是会枚举到合数吗?

确实,他会枚举到合数,但是这些合数在我们分解质因数的途中也被分解掉了,故而枚举不到这些合数。

即:设我们分解一个数N,我们会从2开始分解它

​ 我们会尝试它能不能被P1分解,换句话说看这个数能不能被2分解,如果可以,我们就执行N=N/P1,重复执行n次后,便得到a1。同理可得。我们可以再执行N=N/P2N=N/P3 N=N/Pk 在此途中,我们每枚举到Pi的时候,设从 2i1此时有一个合数是N的约数,设其为d。但我们这个合数也可以被分解为 d=Pp1b1+Pp2b2++ppi1bi1 故而这个合数自然而然的在前面的枚举的过程中被分解掉了。

​ 所以总结来说,既然2i1这个过程中所有合数都被分解之前的质因数除掉了,所以如果我们取到了新的可以整除N的数num的话,这个num只能是新出现的质因数Pi

代码:(yxc版本)

#include <iostream>
#include <algorithm>

using namespace std;

void divide(int x)
{
    for (int i = 2; i <= x / i; i ++ )
        if (x % i == 0)
        {
            int s = 0;
            while (x % i == 0) x /= i, s ++ ;
            cout << i << ' ' << s << endl;
        }
    if (x > 1) cout << x << ' ' << 1 << endl;
    cout << endl;
}

int main()
{
    int n;
    cin >> n;
    while (n -- )
    {
        int x;
        cin >> x;
        divide(x);
    }

    return 0;
}

作者:yxc
链接:https://www.acwing.com/activity/content/code/content/49974/
来源:AcWing
posted @   xbdx  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示