求一个数的所有因数+质因数分解【数论】

先附上所有因数的求法:

我的做法:是今天误打误撞写出来的;

http://exam.upc.edu.cn/problem.php?id=5062

然后,我上网找居然没有人写一个高效一点的,我这个做法其实就是.

不一定要会比根号N快,但是

模拟求所有因子个数的做法:

大家知道为什么所有因子的个数为:

设P1,P2……Pn都是数的质因子,

设C1,C2……Cn是数的质因子的个数:

Ans=(C1+1)*(C2+1)*……*(Cn+1)

大家想知道模拟一下就知道为什么了。

比如120=2*2*2*3*5;

那么Ans=(3+1)*(1+1)*(1+1)

要是求它的因子那么就是:

   (1+2+4+8)*(1+3)*(1+5)

=(1+2+4+8)+(3+6+12+24)+(5+10+20+40)+(15+30+60+120)

其中所有因数为:

1 , 2 , 3 , 4 , 5 , 6 , 8 , 10 , 12  ,  15  ,  20  ,  24  ,  30  ,  40  ,  60  ,  120

因数之和就是

=(1+2+4+8)+(3+6+12+24)+(5+10+20+40)+(15+30+60+120)

大家琢磨琢磨为什么是这样。

#include<bits/stdc++.h>
using namespace std;
const int N=5e6+10;
typedef long long ll;
ll qpow(ll a,ll b){
    ll ans=1;
    while(b){
        if(b&1){
            ans=ans*a;
        }
        a=a*a;
        b>>=1;
    }
    return ans;
}
/*
 (2*3*5*7*11)*(13*17*19*23*29)*(31*37*41*43*47)
=614,88978,25884,91410
    前15个质数相乘得到一个 6 e18的数字
*/
vector<ll>v[20];
map<ll,int>Vis;
ll a[N],cnt,Type;
void dfs(ll x,int step){
    if(Vis[x]==0&&step==Type){
        Vis[x]=1;
        a[cnt++]=x;
        return ;
    }
    for(int i=0;i<v[step].size();i++){
        dfs(x*v[step][i],step+1);
    }
}
void solve(){
    ll n;
    scanf("%lld",&n);
    cnt=0;
    for(int i=0;i<20;i++){
        v[i].clear();
    }
    Type=0;
    Vis.clear();
    for(ll i=2;i*i<=n;i++){
        if(n%i==0){
            int D=0;
            while(n%i==0){
                D++;
                n/=i;
            }
            for(int j=0;j<=D;j++){
                v[Type].push_back(qpow(i,j));
            }
            Type++;
        }
    }
    if(n!=1){
        v[Type].push_back(1);
        v[Type].push_back(n);
        Type++;
    }
    dfs(1,0);
    sort(a,a+cnt);
    for(int i=0;i<cnt;i++){
        printf("%lld%c",a[i],i==cnt-1?'\n':' ');
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        solve();
    }
    return 0;
}

 归纳总结一下:质因数分解更快的做法:


1589: 题目名称:分解质因数

时间限制: 1 Sec 内存限制: 128 MB

题目描述

求出区间[a,b]中所有整数的质因数分解。

 

输入

输入两个整数ab

 

输出

每行输出一个数的分解,形如k=a1*a2*a3...(a1<=a2<=a3...k也是从小到大的)(具体可看样例)

 

样例输入

3 10

样例输出

3=3

4=2*2

5=5

6=2*3

7=7

8=2*2*2

9=3*3

10=2*5

 

提示

先筛出所有素数,然后再分解。

数据规模和约定

2<=a<=b<=10000

#include<bits/stdc++.h>
using namespace std;
const int N=100;
typedef long long ll;
ll a[N],cnt;
void solve(ll n){
    ll tn=n;
    cnt=0;
    for(ll i=2;i*i<=n;i++){
        if(n%i==0){
            int D=0;
            while(n%i==0){
                D++;
                n/=i;
                a[cnt++]=i;
            }
        }
    }
    if(n!=1){
        a[cnt++]=n;
    }
    sort(a,a+cnt);
    printf("%lld=",tn);
    for(int i=0;i<cnt;i++){
        printf("%lld%c",a[i],i==cnt-1?'\n':'*');
    }
}
int main()
{
    ll n,m;
    scanf("%lld%lld",&n,&m);
    for(ll i=n;i<=m;i++){
        solve(i);
    }
    return 0;
}

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值