題目:求一個數的質因數分解,比如輸入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");}