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