• 面试题:求质因数分解


    题目:求一个数的质因数分解,比如输入90,输出2*3*3*5

    解体思路:

    要求一个数n的质因数分解,首先求出n以内的所有质数,将其放入prime[]数组内,然后再让prime[i]去除n,如果能够整除,那么这个prime[i]就是n的质因数,否则不是。

    求prime[]的方法是筛法求素数。

    代码实现

    View Code
    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    
    bool isPrime(int number);//判断number是否为素数
    void PrintPrime(int number);//查找0...number以内的所有素数,没查到一个输出
    void PrintArray(int arry[],int len);//打印数组
    void getPrime2(int number,int prime[]);//通过isPrime(int number)方法来求素数数组
    void getPrime3(int number,int prime[]);//直接在方法内实现isPrime(int number)
    
    
    //筛法求素数
    int getPrime(int number,int prime[])
    {
        int len=number+1;
        int count=0;
        int i,j;
        bool *flag=new bool[len];
        //初始化flag,全部为true;
        for(i=0;i<len;i++)
        {
            flag[i]=true;
        }
    
        for(i=2;i<=sqrt(number);i++)//number的质因数肯定小于sqrt(n)
        {
            if(flag[i])//如果i为素数,那么i的倍数i*j都为合数,这些倍数为j=2,3,4....
            {
                //i表示质因数,j表示倍数
                for(j=2;i*j<=number;j++)//只要i*j<=number则一直往后赋值flag[];
                {
                    flag[i*j]=0;
                }
            }
        }
    
        for(i=2;i<=number;i++)
        {
            if(flag[i])
            {
                prime[count++]=i;
            }
        }
    
        PrintArray(prime,count);
        return count;
    }
    
    
    
    
    //判断是否是素数
    bool isPrime(int number)
    {
        int i;
        bool flag=true;
        for(i=2;i<=sqrt(number);i++)//如果number=2,3的话执行不了for循环,直接返回前面的flag,刚好为true。
        {
            if(number%i==0)
            {
                flag=false;
                break;
            }
        }
        return flag;
    }
    
    //打印2...number的素数
    void PrintPrime(int number)
    {
        int count=0;
        for(int i=2;i<=number;i++)
        {
            if(isPrime(i))
            {
                count++;
                cout<<i<<endl;
            }
        }
        //cout<<count<<endl;
    }
    
    //打印数组
    void PrintArray(int arry[],int len)
    {
        for(int i=0;i<len;i++)
            cout<<arry[i]<<" ";
        cout<<endl;
    }
    
    
    //将number以内的素数保存在prime[]中
    void getPrime2(int number,int prime[])
    {
        int count=0;
        for(int i=2;i<=number;i++)
        {
    
            if(isPrime(i))
            {
                prime[count++]=i;
            }
        }
        PrintArray(prime,count);
    }
    
    //将number以内的素数保存在prime[]中
    void getPrime3(int number,int prime[])
    {
        int count=0;
        for(int i=2;i<=number;i++)
        {
            bool flag=true;
            for(int j=2;j<=sqrt(i);j++)//注意这里是j<=sqrt(i),而不是j<=sqrt(number)
            {
                if(i%j==0)
                {
                    flag=false;
                    continue;
                }
            }
    
            if(flag)
            {
                prime[count++]=i;
            }
        }
        PrintArray(prime,count);
    }
    
    
    
    void main()
    {
    
        int number=90;
        int *prime=new int[number];
        //getPrime2(number,prime);//将素数保存在prime[]数组当中
        //getPrime3(number,prime);//将素数保存在prime[]数组当中
        //getPrime(number);
        //cout<<isPrime(number)<<endl;//bool类型输出的时候,true=1,false=0
        //PrintPrime(number);
    
    
        int len=getPrime(number,prime);//将素数保存在prime[]数组当中
        for(int i=0;i<len,number>=prime[i];i++)//number再变小,prime[i]在变大,如果number<prime,则没有必要再计算
        {
            while(number%prime[i]==0)
            {
                number=number/prime[i];
                cout<<prime[i];
                if(number!=1)//如果number==1的话,则表示i是最后一个因子了,所以它的后面不需要再输出*
                    cout<<"*";
            }
        }
        delete []prime;
        system("pause");
    }
  • 相关阅读:
    axure rp8.0 序列号,亲测可以用
    纯html页面之间传参
    js下载项目中的文件
    Java获取用户ip
    阿里云部署多个tomcat
    少小有才国家用,老大空长做何为
    获取 web 服务器 port
    知识的迁移和学习能力才是最重要的
    eclipse 安装和使用AmaterasUML
    Eclipse中tomcat更改部署路径 deply path
  • 原文地址:https://www.cnblogs.com/xwdreamer/p/2722485.html
Copyright © 2020-2023  润新知