计算题:分解质因数

来源:互联网 发布:高清网络监控系统方案 编辑:程序博客网 时间:2024/04/29 02:18

问题:
每个合数都可以写成几个质数相乘的形式。其中每个质数是这个合数的因数,叫做这个合数的分解质因数。
输出样例:
输入样例:28;
输出样例:28 = 2 * 2 * 7;

分析:
1、合数是相对于质数(素数)的概念;
2、可以先对这个合数进行任意分解(i,j);
3、对分解出来的因数分别进行判断,如果为素数则记录为结果之一进行输出,如果不是则继续分解,直至分解到不能在分解(最小的素数为2,即传入的参数不能小于2);
4、综上分析使用递归解决:
出口:传入参数小于2则停止;
函数体: 如果传入的参数不为素数,则进行分解;
递归调用: 分解后调用自身;

完整代码实现:

#include <iostream>#include <vector>using namespace std;vector<int> vec;void fen_jie(int num){    int code = 0;    if (num < 2) return;    for (int i = 2; i < num; ++i)    {        if (num % i == 0)        {            code = i;            break;        }    }    if (code == 0)    {        vec.push_back(num);        return;    }    else    {//        for (int i = 2; i < num; ++i)//        {//            if (num % i == 0)//            {//                fen_jie(i);//                fen_jie(num / i);//                break;//            }//        }        fen_jie(code);        fen_jie(num / code);    }}void show(int num){    cout << num << " = ";    for (vector<int>::size_type ix = 0; ix != vec.size(); ++ix)    {        cout << vec[ix];        if (ix < vec.size() - 1)            cout << " * ";    }    cout << endl;    return;}int main(){    int num;    while(cin >> num)    {        fen_jie(num);        show(num);        vec.clear();    }    return 0;}

代码解释:
1、在主函数中输入一个num参数,将num作为实参传入fen-jie函数中,进项运算;
2、num传入后,首先进行判断是否满足出口条件,然后判断是否为素数,判断完成后如果是则写入vec容器中,如果不是则再分解,然后调用自己;
3、在素数判断这部分,没有使用传统手法上的遍历判断,而是一旦发现有可以整除的其他因数时就记录下来(用code记录是因为方便下面的合数分解)然后停止判断;如果code的值不变则说明是素数,如果发生变化则说明不是素数,需要进行下一步分解,此时便用到了刚才code所记录下来从此小到大第一个因数,就可以将此合数分解为,code 和 num/code;
4、在调用完fen-jie之后,调用show函数进行输出;
5、因为本例中设置为循环输入测试,所以每次循环运算完成之后需要将vector重置,否则会将之前的答案一并输出;

0 0
原创粉丝点击