求质因数问题

来源:互联网 发布:社交网络 thunder 编辑:程序博客网 时间:2024/06/05 11:43

一、求一个数的所有质因数(尤其n很大时)

我刚开始想的是观察题目给的数据范围,预处理出能够满足这个范围的所有素数,也就是2~sqrt(n)范围内的素数,然后根据输入的n一次遍历这些素数,判断是否整除,但是有一个bug是这种方法只能求出sqrt(n)以内的质因数。所以这个方法不可行。

可行方案:

long long a[],n,cnt=0;for(int i=2;i*i<=n;i++){if(n%i==0){a[cnt++]=i;while(n%i==0)   n/=i;}}if(n>1) a[cnt++]=n; 

二、求多个数的质因数(n不是很大)

在素数筛的时候加了一个vector数组就实现了。

这里其实就用到了我上面的想法,不过正如你所看到的这种方法只能求n不大的。

int vis[100010];//测试了一下,10^6的时候就很慢了,所以用来做最多10^5的数 vector<int>a[100010];memset(vis,0,sizeof(vis));for(int i=0;i<100010;i++)   a[i].clear();for(int i=2;i<100010;i++){if(!vis[i]){vis[i]=1;a[i].push_back(i); for(int j=2;j*i<100010;j++){vis[j*i]=1;a[j*i].push_back(i);}}}



0 0