求助 整数因子分解问题
问题描述:大于1的正整数n可以分解为n=x1 * x2 * ... * xn
例如n=12时
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
1<=n<=2000000000
对于这道题,我可以用递归做,不过参考书上说这题可以用动态规划做
在此请教一下大牛
2007-09-13 21:24
2007-09-14 12:44
2008-03-20 08:36
2008-03-21 12:17

2008-03-21 18:41
程序代码:
/*
E-mail: sunkai [at] msn [dot] com
问题描述:
大于1的正整数n可以分解为n=x1 * x2 * ... * xn
例如n=12时
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
1<=n<=2000000000
*/
/*
分析:
DP之记忆化搜索
状态若用d[2000000000]则内存不足
因此采用结构体记录状态
经过简单数学推理,对于一个数N,它的因子数不超过N^(1/2)+1
*/
#include<stdio.h>
#include<math.h>
struct DP
{
int num;
int sum;
} d[50000]={0};
int max=0;
void qsort(int low,int high,struct DP key[])
{
int i=low,j=high;
struct DP tag=key[i];
if(i<j)
{
do
{
while(tag.num<key[j].num && i<j) j--;
if(i<j)
{
key[i]=key[j];
i++;
while(tag.num>=key[i].num && i<j) i++;
if(i<j)
{
key[j]=key[i];
j--;
}
}
}while(i<j);
key[i]=tag;
qsort(low,j-1,key);
qsort(i+1,high,key);
}
}
int dfs(int left)
{
int i,p;
int l,r,m;
int count=0;
l=0; r=max;
while(l<=r)
{
m=(l+r)>>1;
if(d[m].num<left) l=m+1; else r=m-1;
}
p=l; if(d[p].sum) return d[p].sum;
for(i=1;i<=d[i].num;i++)
{
if(left%d[i].num==0) count+=dfs(left/d[i].num);
}
d[p].sum=count;
return count;
}
int main(void)
{
int i,j,tmp;
int n;
scanf("%d",&n); tmp=sqrt(n);
for(i=1;i<=tmp;i++)
{
if(n%i==0)
{
d[max].num=i; max++;
d[max].num=n/i; max++;
}
} max--;
qsort(0,max,d);
d[0].sum=1;
printf("%d\n",dfs(n));
return 0;
}
2008-03-21 19:37

2008-03-21 19:42
2008-05-29 12:14
2008-05-29 12:48

2008-05-30 19:47