回文素數的判斷,怎么更高效率判斷素數


題目要求是不超過1s

自己寫的代碼如下:注意sqrt處的= ,25的質因數為5*5,不加=,25會被判斷為素數

 1 bool isP(int n)
 2 {
 3     int dig = 0;
 4     int sum = 0;
 5     int m = n;
 6     while (n)
 7     {
 8         dig = n % 10;
 9         n = n / 10;
10         sum = sum * 10 + dig;
11     }
12     
13     if (sum == m) return true;
14     else return false;
15 
16 }
17 bool isprimer(int n)
18 {
19     for (int i = 2; i <=sqrt(n); i++)
20         if (n%i == 0) return false;
21     return true;
22 }
23 int main()
24 {
25     
26     int l, r;
27     while (cin >> l >> r)
28     {
29         int count = 0;
30         for (int i = l; i <= r; i++)
31         {
32             if (isP(i) && isprimer(i)) count++;
33         }
34         cout << count << endl;
35     }
36 }
View Code

只能通過70%,原因是isprimer的效率不夠高,這兩個函數的先后調用順序也要注意

http://blog.csdn.net/tigerisland45/article/details/70236364

高效率的素數為:

 1 bool isprime(int n)  
 2 {  
 3     if(n == 1)  
 4         return false;  
 5   
 6     if(n == 2)  
 7         return true;  
 8   
 9     if(n % 2 == 0)  
10         return false;  
11   
12     int end = sqrt(n);  
13     for(long i=3; i<=end; i+=2)  
14         if(n % i == 0)  
15             return false;  
16   
17     return true;  
18 }  

1、判斷回文數: int轉換為string,再反轉,比較,或者從首尾開始,向中間比較

 1 int isPr(int n)
 2 {
 3     //數字字符轉換為int,'0'-'0','1'-'0'為1
 4     string  s = to_string(n);
 5     /*string s2 = s;
 6     reverse(s.begin(), s.end());*/
 7     for (int i = 0; i <=s.size()/2; i++)
 8     {
 9         if (s[i] != s[n - 1 - i]) return false;
10     }
11     //return s == s2;
12     return true;
13 }
(int i = 0; i <=s.size()/2; i++)

0-7,i=s.size()/2=4, n-1-i=3,i=3時要比較一次s[3]和s[4],i=4又要比較一次s[4]和s[3]

0-8,i最大為4,i=4,比較s[4]和s[4]

如果i<s.size()/2,不要等號,能少一次比較,數組個數為奇數能不掃描中間的s[4]

2、怎樣獲得一個數的首位?下面不用轉換為string,直接獲取數字的首尾比較(http://qiemengdao.iteye.com/blog/1660227)

 1 bool isPalindrome(int x)   
 2 {  
 3   if (x < 0) return false;  
 4   int div = 1;  
 5   while (x / div >= 10) {  
 6     div *= 10;  
 7   }  
 8   while (x != 0) {  
 9     int l = x / div;    
10     int r = x % 10;  
11     if (l != r) return false;  
12     x = (x % div) / 10;  
13     div /= 100;  
14   }  
15   return true;  
16 }  

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com