problemD_1176

算是筛选法的一种变形应用吧,

首先简单说说筛选法(这里只给出核心循环段),假设int prim[maxn],如果prim[i]=0则为素数,反之不是素数。

  1.  memset(prim,0,sizeof(prim));
  2.  for(int i=2;i<maxn;i++){
  3.      if(prim[i]==0){
  4. for(int j=2;j*i<maxn;j++)
  5. prim[j*i]=1;
  6.    }

该题题意为给一个数字,进行因数分解,要求分接的因数从小到大排列,其实和这个筛选也很类似了,假如一个数字n如果含有因数k那么就会 n%k==0;然后我们进行分解,于是n'=n/k; 但是n'是否含有因数k呢,所以如果是循环for(i)的话就需要进行i--操作,因此凡是k的倍数全部被干掉了,一直到n=1.

  
  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;

  4. int main(){
  5.     int T,n;
  6.     scanf("%d",&T);
  7.     while(T--){
  8.         scanf("%d",&n);
  9.         if(n==1){
  10.             printf("1=1\n");
  11.             continue;
  12.         }
  13.         bool flag=true;
  14.         printf("%d=",n);
  15.         for(int i=2;n!=1;i++){
  16.             if(n%i==0){
  17.                 if(flag)
  18.                     {flag=false;printf("%d",i);}
  19.                 else
  20.                     printf("*%d",i);
  21.                 n/=i;
  22.                 i--;
  23.             }
  24.         }
  25.         printf("\n");
  26.     }
  27.     return 0;
  28. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值