打表素数筛法超时了,现在想不到怎么解决这个问题,或者说,取巧把素数表直接粘贴上去呢。试了还是超时,最重要的是long以内的素数特别多,所以表格特别长,另外也超时了
然后看了下别人的,这里贴一下解析吧
//其实除的过程中不需要判断除数是不是质数,因为如果能被合数整除,一定会先被比它更小的质数整除,所以只需从2开始遍历除数即可
这是大佬的程序,两个测试用例有问题,第一个,后面有一的情况下,会输出n是一,已经解决了,第二个超时的话,线性一层循环也超时,想不到更好的解决办法
#include<bits/stdc++.h>
using namespace std;
int main() {
long n; cin >> n;
for(int i = 2; i < n; i ++)
while(n % i == 0) {
cout << i << " ";
n /= i;
}
if(n!=1){
cout << n << " ";
}
return 0;
}然后下面是我自己的解法,就是比较复杂,所以这种解法有点麻烦
#include<stdio.h>
int prime[1000005];
//素数筛法
void isprime(int n){
for(int i=2;i<=n;i++){
prime[i]=1;
}
for(int i=2;i<=n;i++){
if(prime[i]==1){
for(int j=2*i;j<=n;j=j+i){
prime[j]=0;
}
}
}
}
//能被二整除就一直除二,能被三整除就一直除三
int main(){
int n;
scanf("%d",&n);
isprime(n);
int tmp=n;
while(n!=1){
for(int i=2;i<tmp;i++){
if(prime[i]==1){
if(n%i==0){
n=n/i;
printf("%d ",i);
break;
}
}
}
}
return 0;
} 最后贴一个正确解法吧就酱紫,也是别人写的
#include<stdio.h>
#include<math.h>
int main()
{
long num = 0;
int i;
while (scanf("%ld", &num) != EOF) {
int maxi = sqrt(num);
for (i = 2; i <= maxi; i++) {
while (!(num % i)) {
num /= i;
printf("%d ", i);
}
}
if (num != 1) {
printf("%d ", num);
}
printf("\n");
}
return 0;
}
京公网安备 11010502036488号