算是筛选法的一种变形应用吧,
首先简单说说筛选法(这里只给出核心循环段),假设int prim[maxn],如果prim[i]=0则为素数,反之不是素数。
- memset(prim,0,sizeof(prim));
- for(int i=2;i<maxn;i++){
- if(prim[i]==0){
- for(int j=2;j*i<maxn;j++)
- prim[j*i]=1;
- }
- }
该题题意为给一个数字,进行因数分解,要求分接的因数从小到大排列,其实和这个筛选也很类似了,假如一个数字n如果含有因数k那么就会 n%k==0;然后我们进行分解,于是n'=n/k; 但是n'是否含有因数k呢,所以如果是循环for(i)的话就需要进行i--操作,因此凡是k的倍数全部被干掉了,一直到n=1.
- #include<iostream>
- #include<cstdio>
- using namespace std;
- int main(){
- int T,n;
- scanf("%d",&T);
- while(T--){
- scanf("%d",&n);
- if(n==1){
- printf("1=1\n");
- continue;
- }
- bool flag=true;
- printf("%d=",n);
- for(int i=2;n!=1;i++){
- if(n%i==0){
- if(flag)
- {flag=false;printf("%d",i);}
- else
- printf("*%d",i);
- n/=i;
- i--;
- }
- }
- printf("\n");
- }
- return 0;
- }