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