zoukankan      html  css  js  c++  java
  • 分解质因数

    想将一个整数m分解为质因数乘积的形式,怎么办?

    最简单的方法就是直接枚举2到sqrt(m)判断输出

    实现代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 int n;
     4 int main(){
     5     scanf("%d",&n);
     6     for(int i=2;i*i<=n;i++){
     7         while(n%i==0){
     8             printf("%d ",i);
     9             n/=i;
    10         }
    11     }
    12     if(n>1) printf("%d",n);
    13     return 0;
    14 }
    朴素算法

    时间复杂度为O(sqrt(n))

    其实,我们可以借助线性筛法求质数过程中所求出的每个数的最小质因数来提升效率

    关于质数的线性筛法可以看我的一篇随笔:http://www.cnblogs.com/lpl-bys/p/7726113.html

    因为我们已经知道了每个数的最小质因数,所以我们每次输出这个数m的最小质因数,然后m再去除以它的最小质因数,然后再查表找到除后的数的最小质因数输出......直到m==1

    实现代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #define maxn 23333333
     4 bool zs[maxn];
     5 int prime[maxn],n,num,an[maxn];
     6 int main(){
     7     memset(zs,0,sizeof(zs));
     8     scanf("%d",&n);
     9     zs[0]=zs[1]=1;num=0;
    10     for(int i=2;i<=n;i++){
    11        if(!zs[i]) prime[++num]=an[i]=i;
    12        for(int j=1;j<=num&&i*prime[j]<=n;j++){
    13              zs[i*prime[j]]=1;
    14              an[i*prime[j]]=prime[j];
    15              if(!(i%prime[j])) break;
    16        } 
    17     }
    18     while(n>1){
    19         printf("%d ",an[n]);
    20         n/=an[n];
    21     }
    22     return 0;
    23 }
    线性筛实现质因数分解
  • 相关阅读:
    mysql数据库中的锁
    HihoCoder
    旅游规划(双权连通图)
    单调栈的原理
    战争联盟(并查集)
    点赞狂魔(巧用STL容器事半功倍)
    这是二叉搜索树吗?
    好像是两种权的dijkstra
    pat--046.整除光棍(除法模拟)
    幸运数字 2
  • 原文地址:https://www.cnblogs.com/lpl-bys/p/7728492.html
Copyright © 2011-2022 走看看