[关闭]
@geek-sjl 2018-10-14T15:31:47.000000Z 字数 1040 阅读 399

18图灵班作业6--LeetCode编程题

先是普通筛法

  1. class Solution {
  2. public:
  3. int countPrimes(int num) {
  4. int ans=0;
  5. bool* NotPrime=new bool[1500000+5];
  6. NotPrime[1]=1;
  7. NotPrime[2]=0;
  8. NotPrime[3]=0;
  9. for(int i=2;i<num;i++){
  10. if(NotPrime[i]) continue;
  11. for(int j=i+i;j<num;j+=i){
  12. NotPrime[j]=1;
  13. }
  14. }
  15. for(int i=1;i<num;i++){
  16. if(!NotPrime[i]) ans++;
  17. }
  18. return ans;
  19. }
  20. };

首先筛法是离线算法,用在这类批量查询的题上肯定是有很大优势的。
然后尝试着写了一下米勒拉宾。

  1. class Solution {
  2. typedef long long LL;
  3. public:
  4. LL QuickPower(LL a,LL b,LL n){
  5. LL res=1;LL base=a;
  6. while(b>0){
  7. if(b&1) res=(res*base)%n;
  8. base=(base*base)%n;
  9. b>>=1;
  10. }
  11. return res;
  12. }
  13. bool MillerRabbin(int n,int a){
  14. int r=0,s=n-1;
  15. if(!n%a) return false;
  16. while(!(s&1)){
  17. r++;
  18. s>>=1;
  19. }
  20. LL k=QuickPower(a,s,n);
  21. if(k==1) return true;
  22. for(int j=0;j<r;j++,k=(k*k)%n){
  23. if(k==n-1) return true;
  24. }
  25. return false;
  26. }
  27. bool IsPrime(int n){
  28. int a[]={2,7,61};
  29. for(int i=0;i<3;i++){
  30. if(n==a[i]) return true;
  31. if(!MillerRabbin(n,a[i])) return false;
  32. }
  33. return true;
  34. }
  35. int countPrimes(int num) {
  36. int ans=0;
  37. for(int i=2;i<num;i++){
  38. if(IsPrime(i)) ans++;
  39. }
  40. return ans;
  41. }
  42. };

结果是超时。
本地run code 是700ms+,但submit就是tle.
然后我试着把a改成只用2,5两个,还是超时。(本地测试答案是正确的)
也试着把k=(k*k)%n这类的改写成快速幂,特判可以直接整除的情况,还是超时。
老师有空的话帮我看看,是我的实现方式过于低效了吗?

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注