面試題:求質因數分解

來源:互聯網
上載者:User
題目:求一個數的質因數分解,比如輸入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");}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.