整数因子分解问题

本文介绍了一种计算大于1的正整数n的不同分解式数量的算法。通过从2到sqrt(N)查找所有因子,并递归计算每个因子的分解式数量,最终得到N的所有可能分解方式的数量。

整数因子分解问题

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

大于1的正整数n可以分解为:n=x1*x2*…*xm。例如,当n=12 时,共有8 种不同的分解式:
12=12;
12=6*2;
12=4*3;
12=3*4;
12=3*2*2;
12=2*6;
12=2*3*2;
12=2*2*3。
对于给定的正整数n,计算n共有多少种不同的分解式。

Input

输入数据只有一行,有1个正整数n (1≤n≤2000000000)。

Output

将计算出的不同的分解式数输出。

Sample Input

12

Sample Output

8

Hint

Source

  • 基本的思路:
  • 一个数N,从2---->sqrt(N)找n%i==0的数,也就是他的因子
  • 找到他的全部因子后,他的因子又找自己的因子
  • 然后递归从小到大的把分解式的个数加起来直到N,结束
  • eg:如下图:
  • n=16
  • 16他的因子是2,4,8,
  • 2--->分解式--->1(他本身)
  • 4--->分解式--->2(2的分解式+他本身)
  • 8--->分解式--->4(2和4的分解式+他本身)
  • 则16--->分解式--->8(2和4和8的分解式+他本身)

来自本人精心打造的小图图

#include <bits/stdc++.h>
using namespace std;
//const int maxn=100001;
//int a[maxn];
int pre(int n)
{
    int sum=1;//数的本身
    //if(n<maxn&&a[n]!=0)return a[n];
    for(int i=2; i<=sqrt(n); i++)//折半找他的因子
    {
        if(n%i==0)//能整除,就是他的因子
        {

            if(i*i==n)//看我画的图哈
                sum+=pre(i);//printf("i=%d %d\n",i,n);
            else sum+=pre(i)+pre(n/i);//printf("j=%d %d\n",i,n);
        }
    }
    //if(n<maxn)a[n]=sum;//把每一个结点的分解式数都存进去
                     //printf("n=%d sum=%d\n",n,sum);
    return sum;//返回总的分解数
}
int main()
{
    int n;
    scanf("%d",&n);
    //memset(a,0,sizeof(a));
    printf("%d",pre(n));
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值