整数因子分解问题Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 大于1的正整数n可以分解为:n=x1*x2*…*xm。例如,当n=12 时,共有8 种不同的分解式: Input 输入数据只有一行,有1个正整数n (1≤n≤2000000000)。 Output 将计算出的不同的分解式数输出。 Sample Input Sample Output 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的正整数n的不同分解式数量的算法。通过从2到sqrt(N)查找所有因子,并递归计算每个因子的分解式数量,最终得到N的所有可能分解方式的数量。
290

被折叠的 条评论
为什么被折叠?



