自然数积分解
【题目描述】
现需要把自然数N分解为若干个自然数之积,输出方案数。
【输入描述】
输入一个自然数N(1 ≤ n ≤ 2000000000)。
【输出描述】
输出一个数,表示方案数。
【样例输入】
20
【样例输出】
4
【数据范围及提示】
样例可分为:
20
4*5
2*10
2*2*5
优化前:
源代码: #include<cstdio> int n,ans(0); void Solve(int t,int num) //做题还是少啊! { if (num==1) //整除完毕。 { ans++; return; } for (int a=t;a<=num;a++) //因数呈上升趋势,避免了重复。 if (!(num%a)&&a!=1) //1的情况直接排除掉,避免无限递归。 Solve(a,num/a); } int main() { scanf("%d",&n); Solve(1,n); printf("%d",ans); return 0; }
优化后:
源代码: #include<cstdio> int n,ans=1; void Solve(int t,int num) { for (int a=t;a*a<=num;a++) //简单的数学原理,不过没有了N本身的情况,故结果要+1。 if (!(num%a)&&a!=1) //将优化前的程序由离散到聚集。只要成立,便已是1种方案,接下来只需要查看这种方案的子方案就可以了。 { ans++; Solve(a,num/a); } } int main() { scanf("%d",&n); Solve(1,n); printf("%d",ans); return 0; }