数论(一)—— 质数(判断质数、分解质因数)

质数

定义:在大于1的整数中,如果只包含1和本身这两个约数,就倍称为质数或素数。

质数的判定——试除法

最暴力的写法:时间复杂度O(n)

bool is_prime(int x)
{
    if(x < 2) return false;
    for(int i = 2; i < x; i ++ )
        if(x % i == 0) return false;
    return true;
}

从定义出发,首先看这个数是不是大于2,然后看能否被除1和它本身外其它数整除。
优化
如果 d | n (d能整除n),那么 n/d | n (n除以d也能整除n)。就像 12 | 3,而12 / 3 = 4,则 12 | 4 .
可以看到,质数是成对出现的,因此我们在枚举时,只需要枚举每一对儿中较小的那个,即只需要枚举 d ≤ n/d 这样的数,即 d ≤ √n 这样的数。这样时间复杂度就可以降低到O(√n)(而且一定是√n,而不是最坏),显然是一个质的飞跃。

bool is_prime(int x)
{
    if(x < 2) return false;
    for(int i = 2; i <= x/i; i ++ )
        if(x % i == 0) return false;
    return true;
}

注意:for循环中不建议这样写:for(int i = 2; i <= sqrt(x); i ++ ),每次循环都要执行一遍循环条件,但是sqrt()这个函数比较慢;
也不建议写成 i*i <= n,当n比较接近于int的最大值时,存在溢出风险,溢出后i就会变成一个负数;
综上,推荐上面给出的写法,即 i <= x/i。

分解质因数——试除法

思路:从小到大枚举所有数(尝试x的所有因数)
概念:把一个合数分解成若干个质因数的乘积的形式,即求质因数的过程叫做分解质因数

#include<iostream>

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 ++ ; //s为i的指数
            }
            printf("%d %d\n",i,s);
        }
        
    if(x > 1) printf("%d %d\n",x,1); //大于sqrt(x)的质因子
    puts(" ");
}

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

时间复杂度:最坏:O(√n),最好:O(logn),实际一般介于二者之间
注意
1.一个很重要的性质:x中最多只包含一个大于sqrt(x)的质数(很好证明,因为如果有两个的话相乘就大于x了,这是矛盾了),所以我们枚举时可以先把小于sqrt(x)的质因子枚举出来。循环结束后,x若是大于1的,说明此时这个x就是那个大于sqrt(x)的质因子。
2.我们可能会疑问,我们要找的是n的所有的质因子,可是我们枚举的是x的所有因数,这其中会包含合数,那么会不会有问题呢?
其实是没有问题的,因为当我们枚举到 i 时,就意味着我们已经把 x 的2~i-1的所有质因子都除干净了(x/=i),也就是说我们此时的x中不含有2 ~ i -1的任何质因子了,如果满足if(x%i == 0),那么说明 i 中也一定不含2 ~ i -1的任何质因子,那么这个 i 一定是个质数。
换句话说,如果i是一个合数的话,合数可以被分解成多个质数相乘,而这多个质数一定比i小且都为x的因子,但比i小的数在之前就已经被除掉了,所以i一定是一个质数。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: A: ```python def factorize(num): factors = [] divisor = 2 while divisor <= num: if num % divisor == 0: factors.append(divisor) num /= divisor else: divisor += 1 result_str = str(factors[0]) for i in range(1, len(factors)): result_str += "*" + str(factors[i]) return "{}={}".format(num, result_str) # 测试 print(factorize(90)) ``` 输出: ``` 1=[2*3*3*5] ``` 注:这里的返回值是用字符串表示的分解结果。 ### 回答2: 要将一个正整数分解质因数,可以采用如下步骤: 1. 首先,定义一个变量num,表示要分解的正整数。 2. 初始化一个空列表factor_list,用于存储分解后的质因数。 3. 创建一个for循环,不断遍历2到num之间的所有整数。 4. 在循环中,判断当前整数i是否能够整除num。 - 如果能够整除,将i添加到factor_list中,并将num除以i的结果重新赋值给num。 - 如果不能整除,跳过当前循环。 5. 当循环结束时,判断num是否为1,如果不为1,则说明num本身就是一个质数,则将num添加到factor_list中。 6. 最后,将num和factor_list打印出来,格式为"输入的正整数=质因数1*质因数2*..."。 下面是一个示例代码: ```python num = int(input("请输入一个正整数:")) factor_list = [] for i in range(2, num + 1): while num % i == 0: factor_list.append(i) num /= i if num > 1: factor_list.append(num) print("输入的正整数 =", "*".join(map(str, factor_list))) ``` 例如,当输入90时,输出为"输入的正整数 = 2*3*3*5"。这表示90可以分解为2乘以3乘以3乘以5。 ### 回答3: 要将一个正整数分解质因数,首先需要找到它的最小质因数。然后,我们可以将该质因数除到无法再整除为止。具体步骤如下: 1. 输入一个正整数,如90。 2. 从最小的质数2开始,判断该数是否能被2整除。在该例中,90可以被2整除,所以我们将2作为90的一个质因数。 3. 将90除以2,得到45。再次判断45是否能被2整除,答案是不可以。 4. 接下来,我们从3开始判断45是否能被3整除。在该例中,45可以被3整除,所以我们将3作为45的一个质因数。 5. 将45除以3,得到15。再次判断15是否能被3整除,可以得出答案是可以。 6. 重复以上步骤,我们得到15除以3的结果是5。5是一个质数,所以我们将5作为15的一个质因数。 7. 由于5已经是一个质数,无法再分解,所以我们停止计算。 8. 综上所述,90可以分解质因数为2 * 3 * 3 * 5。 这个方法适用于任何正整数,可以得到它的所有质因数分解形式。质因数分解数论和代数方面起着重要的作用,可以帮助我们更好地理解数的性质。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值