面试题:求质因数分解

题目:求一个数的质因数分解,比如输入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");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值