给定一个整数,求出该整数的所有质因数

题目:质因数分解,给定一个整数,求该数的所有质因数,例如 90 = 2*3*3*5。

  质数又称素数,有无限个。一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除(除0以外)的数称之为素数(质数);否则称为合数。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。
  在自然数域内,质数是不可再分的数,是组成一切自然数的基本元素。 比如,10 是由两个 2 和两个 3 组成的,正如水分子是由两个 H 原子和一个 O 原子组成的一样。只是和化学世界不同,质数有无穷多个,因此算术世界的元素也就有无穷多个。算术世界内的一切对象、定理和方法,都是由其基本元素质数组成的。

  所以,注意,最小的质数(素数是2),1既不是质数也不是合数。回到题目,求一个整数的所有质因数,我们举几个例子来分析问题。比如,数字9 = 3*3,再比如18 = 2*9 = 2*3*3。所以,求解的过程就是从i等于整数2开始搜索,看是否能整除n,如果n能够被一个素数整除,那么判断n/i的商是不是素数,如果不是素数,那么继续求商的所有质因数;如果商也是素数,那么所有的质因数都被找出来了,停止递归。

首先判断一个数是否为素数的函数:

//判断输入整数n是否为素数,也就是质数
bool isZS(int n){
    int sqrtN = (double)sqrt((double)n);
    if(n==1 || n==2)
        return true;
    for(int i=2;i<=sqrtN;i++){
        if(n%i==0){
            return false;
        }
    }
    return true;
}

然后递归求解所有的质因数:

#include <iostream>
#include<math.h>
using namespace std;
//判断输入整数n是否为素数,也就是质数
bool isZS(int n){
    int sqrtN = (double)sqrt((double)n);
    if(n==1 || n==2)
        return true;
    for(int i=2;i<=sqrtN;i++){
        if(n%i==0){
            return false;
        }
    }
    return true;
}

//输出整数n的所有质因数
void findAllZYS(int n){
    if(n==1){
        cout<<1;
        return;
    }
    if(n==2){
        cout<<2;
        return;
    }
    if(isZS(n)){
        cout<<" "<<n<<endl;
        return;
    }
    int i=2;
    for(i=2;i<=n;i++){
        if(isZS(i)&&n%i==0){
            cout<<i<<" ";
            break;
        }
    }
    int nxtN = n/i;
    if(isZS(nxtN)){
        cout<<nxtN<<" "<<endl;
        return;

    }else{
        findAllZYS(nxtN);
    }
}

int main()
{
    int a;
    while(cin>>a){
        findAllZYS(a);
    }

    return 

转自:点击打开链接

猜你喜欢

转载自blog.csdn.net/csdn_chuxuezhe/article/details/79780838