整式因子分解问题

2019-04-14  本文已影响0人  彳亍cium

1. 问题描述

  一个大于1的正整数n可以分解为n=x_1 \cdot x_2 \cdots x_m。例如,当n=12时,共有8种不同的分解式:

12 = 12 \qquad \qquad 12 = 3 \times 2 \times 2 \\ 12 = 6 \times 2 \qquad \qquad 12 = 2 \times 6 \\ 12 = 4 \times 3 \qquad \qquad 12 = 2 \times 3 \times 2 \\ 12 = 3 \times 4 \qquad \qquad 12 = 2 \times 2 \times 3

1.1. 问题分析

  上面描述的分解式不考虑乘法的交换律,所以可以把第一个分解因子看作一个可以被12整除数字的遍历,剩下的因子就是一个递归问题,求解剩下因子的分解式即可,然后把每种因子的分解结果数相加,递归的返回条件是,因子等于1。

int solveInterger(int input){
    if(input <= 0){
        std::cout<<"input is illegal"<<std::endl;
        return -1;
    }
    int result = 0;
    if(input == 1)
        return 1;
    else
        for(int i = input; i > 1 && input % i == 0 ; i--){
                result = result + solveInterger(input/i);  //每种可整除因子递归结果求和
        }
    return result;
}

1.2. 算法分析

  算法中的循环边界是(1,n],其中n是输入的数字,但是能够进入到循环中的次数T肯定小于n。进入循环之后通过递归调用一个更少规模的子问题,输入变成了\frac{n}{i}。但是这其中必然存在重复多算的过程,即递归的是不独立的子问题,如下面的情形取n =24
24 = 2 \times 2 \times 6 \qquad 24 = 4 \times 6

两种情形的子问题都是求解6的整式分解问题,但是会出现多次求解的冗余过程,当数字n比较小的时候出现的这种情形的可能会比较低,但是当n很大时,会造成很坏的情况。

1.3. 实验验证

result.png
上一篇下一篇

猜你喜欢

热点阅读