9718 整数因子分解(递归、备忘录法)

来源:互联网 发布:魅族阿里云系统好用吗 编辑:程序博客网 时间:2024/06/09 14:15

9718 整数因子分解

时间限制:1000MS  内存限制:1000K
提交次数:0 通过次数:0

题型: 编程题   语言: C++;C;VC;JAVA

Description

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



输入格式

第一行一个正整数n (1<=n<=1000000)


输出格式

不同的分解式数目


输入样例

12


输出样例

8


提示

此题因子讲顺序的.第一个因子可能是2~n之间的数.比如对12而言,第一个因子可能是2,3,4,6,12.将第一个因子为2的分解个数,加上第一个因子为3的分解个数,...,直至加到第一个因子为12的分解个数.而第一个因子为2的分解个数又是多少呢?是6(因为12/2=6)的分解个数,递归求解!可用“递归”和“备忘录方法”两种方法分别求解,并测试一下效率。递归实现整数因子分解的计数。假设对正整数n的因子分解计数为solve(n)。1)当n=1时,计数加1。2)当n>1时,对n的每个因子i,计算solve(n/i)。


作者

zhengchan


我的实现代码:

#include <iostream>#include <cmath>#include <string.h>using namespace std;int* arr;int len;// 备忘录法,分成2个因子,递归(Good!)int Note(int n){    if (n < len && arr[n] != 0) {        return arr[n];    }        int count = 1;    int q = sqrt(n);        for (int i = q; i >= 2; i--) {        if (n % i == 0) {            if (i * i == n) {                count += Note(i);            }else{                count += Note(i) + Note(n / i);            }        }    }        if (n < len) {        arr[n] = count;    }        return count;}// (纯粹)递归法int solve(int n){    if (n == 1) {        return 1;    }        int count = 1;        for (int i = n / 2; i >= 2; i--) {        if (n % i == 0) {                        count += solve(n / i);        }    }        return count;}int main(){    int n;        cin >> n;        int q = sqrt(n);    len = q + 1;    arr = new int[len];            memset(arr, 0, len * sizeof(int));        cout << Note(n) << endl;//备忘录法    cout << solve(n) << endl;//纯递归法        cout << endl;    return 0;}



0 0
原创粉丝点击