一、求一个数的所有质因数(尤其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;
在素数筛的时候加了一个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);}}
}
本文发布于:2024-01-28 21:39:41,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170644918510462.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |