思路:
1.首先筛出素数(也即标记哪些数是素数,哪些不是):
用prime数组的值标记素数,prime[i]=0表示:i为素数;prime[i]=1表示:i不为素数;
2.然后获得[a,b]中每个数的质因子乘积形式---把问题分解为小问题:得到x的质因子乘积形式
3.得到x的质因子乘积形式:
用一个while循环(循环终止条件为得到x的质因子乘积形式,循环找质因子t(范围在2到x之间,而且要prime[t]==0),若t符合条件,则把t加到ans数组中(ans数组存x的所有质因子),同时改变x的值(x=x/t),此时判断x的值是否为1,如果为1,表示分解结束,输出x的质因子乘积形式,并且退出循环;否则,while循环继续。
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 using namespace std; 7 #define maxn 10000 8 int prime[maxn],ans[maxn]; 9 //ans数组存一个数的因子,prime[i]数组标记i不为素数 val=0表示i为素数,否则不为素数 10 11 int main(){ 12 int a,b,count=0,x,num=0; 13 cin>>a>>b; 14 memset(prime,0,sizeof(prime)); 15 memset(ans,0,sizeof(ans)); 16 17 for(int i=2;i<maxn;i++){ //筛出素数 18 count=0; 19 for(int j=2;j<=sqrt(i);j++){ 20 if(i%j==0){ 21 count++; 22 } 23 if(count>=1){ 24 prime[i]=1;break; //表示i这个数不是素数 25 } 26 } 27 } 28 29 for(int i=a;i<=b;i++){ 30 num=0; 31 memset(ans,0,sizeof(ans)); 32 cout<<i<<"="; 33 x=i; 34 while(1){ 35 for(int j=2;j<=i;j++){ 36 if((prime[j]==0)&&(x%j==0)){//表示j为素因子 37 x/=j; 38 ans[num]=j; 39 num++; 40 } 41 if(x==1) break; 42 } 43 if(x==1) break; 44 } 45 sort(ans,ans+num);//必须要对因子进行排序 46 for(int h=0;h<num;h++){ 47 if(h!=num-1) cout<<ans[h]<<"*"; 48 else cout<<ans[h]<<endl; 49 } 50 } 51 return 0; 52 }
原文:https://www.cnblogs.com/Aiahtwo/p/12728933.html