打表素数筛法超时了,现在想不到怎么解决这个问题,或者说,取巧把素数表直接粘贴上去呢。试了还是超时,最重要的是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;
}