題目要求是不超過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 }
只能通過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 }
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。