集筛选素数因子和求出相应素数个数的小巧实用型函数

总结:之前这个算法在数论中因为素数而用的非常频繁,所以就小小的总结一下;后来才发现自己原来的代码偏的好厉害

请看我的累赘标记:其实我一开始循环中使用i*i<=tmp的,其实这样减低了这个函数的威力,直接把在变化着的n当做循环的边界是没有错的,因为每时每刻,对于变化着的n,其素数个因子也是当且仅存在一个是大于n的开方的。所以以n来做循环边界完全木有问题。然后再讲一下这个函数的原理:这个函数的i自增当且仅当i不能整除n的时候,这个就是像素数筛选的模拟,把2的的倍数的筛选出来,再把3的倍数筛选出来。只不过这里就是把每一个素数因子从小到大的抽离出来,所以随着i自增,肯定只有是n的素因子才会进入if判断中。

 

program:

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define maxn 1000005 
int pp[maxn],kg;
int nn[maxn],cnt;
void get_prime_num(int n)
{
  //int tmp=n; 累赘1 
  kg=0; 
  for(int i=2;i*i<=n;)//i*i =tmp 累赘2 
  {
      if(n%i==0)
         {
           pp[kg]=i; 
           cnt=0; 
           while(n%i==0)
             {
                n/=i;
                cnt++;   
             }
           pp[kg++]=cnt; //素数个数映射数组 
         }
    else i++; //  Nice  
  }
  if(n!=1)
        {
          pp[kg]=n;
          nn[kg++]=1;          
        }     
} 
int main()
{
int n;
while(cin>>n)
{ 
    get_prime_num(n); 
    cout<<kg<<endl;//素因子的个数 
} 
system("pause"); 
return 0;} 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值