【数论】试除法判断质数,分解质因数,筛质数

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

 

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     现已更新完KMP算法、排序模板,之后我会继续往里填充内容哒。

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

用一篇Blog来讲解下最近学到的数论,为日后的刷题打下坚实的基础。

目录

试除法判断质数:

朴素做法:

代码模板:

改进做法:

 代码模板:

分解质因数:

 代码模板:

筛质数:

 埃式筛法:

欧拉筛(线性筛):

完结撒花:


什么是质数?

一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数

试除法判断质数:

朴素做法:

将定义进行模拟,若整除了除1与其自身的另外的数,则为质数

代码模板:

#include<iostream>
using namespace std;
int n;
void prime(int x)
{
    if(x<2){
        cout<<"No"<<endl;
        return;}
    for(int i=2;i<=x;i++)
    {
        if(x%i==0)
        {
            cout<<"No"<<endl;
            return ;
        }
    }
    cout<<"Yes"<<endl;
    return;
}
int main()
{
    cin>>n;
    while(n--)
    {
        int x;
        cin>>x;
        prime(x);
    }
}

改进做法:

一个数的两个因数都是成对出现的,例如:6的因数为 1 2 3 6 

这里的2与3是成对出现的。所以我们无需从2-x的范围去遍历,因为若前半部分没有出现,则后半部分必然没有其因数

通过反证法:若后半部分有其因数,则就会出现这两个因数相乘会大于其本身。

所以应该满足 i*i<=x的范围,但又因为i*i在数字极大的情况下,很容易溢出,所以改成i<=x/i

 代码模板:

#include<iostream>
using namespace std;
int n;
void prime(int x)
{
    if(x<2){
        cout<<"No"<<endl;
        return;}
    for(int i=2;i<=x/i;i++)
    {
        if(x%i==0)
        {
            cout<<"No"<<endl;
            return ;
        }
    }
    cout<<"Yes"<<endl;
    return;
}
int main()
{
    cin>>n;
    while(n--)
    {
        int x;
        cin>>x;
        prime(x);
    }
}

分解质因数:

 

与上文相同,依然是用到了i*i<=n的这个性质,需要注意一下,最多存在一个>=sqrt(n)的质因子,同样可以用反证法来证明,这里就不过多赘述.所以当最后跳出循环时若还存在x>1,也就是没有被模掉的情况时,则认为x为其较大的那个因子,也需要放进去.

若一个数能整除i,则i是其一个因子,又因为我们从小到达进行遍历,被整除的这个i必然为质因子,因为若为普通因子,在循环整除的时候已经被消掉了,化为其指数.

 代码模板:

#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++;
            }
            printf("%d %d\n",i,s);
        }
        if(x>1)printf("%d %d\n",x,1);
        puts("");
        return ;
}
int main()
{
    int n=0;
    cin>>n;
    while(n--)
    {
        int x;
        cin>>x;
        divide(x);
    }
    return 0;
}

筛质数:

 

 埃式筛法:

一个约数其必然可以由数相乘得到.

假设有如下2到10的数

埃式筛法的核心就是:从头遍历每个数字,将其与每一个小于本身它本身的质数相乘,再将之后的数标记为非质数

也就是这样

 可以看出 这里的质数就为2 3 5 7,

但我们很快就会发现,这个算法有一个弊端,假设这里的范围到12,就会出现当4*3的时候把十二标记为false了,但6*2又会将其标记一次,十分的不优雅.

所以就提出了另一个改进的算法

欧拉筛(线性筛):

当发现相乘的这个质数为其最小质因子时,则停止遍历

#include<iostream>
using namespace std;
const int N=1e6+9;
bool st[N];
int prime[N];
int main()
{
    int n=0;
    int cnt=0;
    cin>>n;
    for(int i=2;i<=n;i++)
    {
        if(!st[i])
        {
            prime[cnt++]=i;
        }
        for(int j=0;prime[j]<=n/i;j++)
        {
            st[prime[j]*i]=true;
            if(i%prime[j]==0)break;
        }
        
    }
    cout<<cnt;
}

完结撒花:

🌈本篇博客的内容【数论:试除法判断质数,分解质因数,筛质数】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

ppeua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值