USACO Prime Palindromes
2012-06-17 16:02
281 查看
两个double之间取余,要用到math.h里的函数
取整与取余
double modf (double, double*); 将参数的整数部分通过指针回传, 返回小数部分
double fmod (double, double); 返回两参数相除的余数
两个double之间判断是否相等,不能用==,目前最优的方案是做差。
if (fabs(result1 - result2) < FLT_EPSILON)
printf( "equals\n ");
详见 45楼 http://topic.csdn.net/t/20061104/21/5133629.html#
判断一个int数是否为回文
取一个double的整数部分——
1、直接赋值给整数变量。如:
inti=2.5;或i=(int)2.5;
这种方法采用的是四舍五入,不适用于你的问题。
2、使用floor函数。floor(x)返回的是x的整数部分。如:
floor(2.5)=2
floor(-2.5)=-2
3、使用ceil函数。ceil(x)返回的是不大于x的最小整数。如:
ceil(2.5)=2
ceil(-2.5)=-3
floor和ceil对于正数没有区别,但是对于负数结果不同。
如果你只是想简单的不用科学计算法来表示一个数,那么在输出的时候用
cout<<std::fixed<<yournumber;
这样就可以了,注意要包含<iomanip>头文件
我的第一版本代码(cao,今天才知道c++里int类型可以表达到2^32,原来只能表示到3万多的那个是short int),从a到b,一个个先判断是否回文数,然后是否质数。test10超时……被无情的鄙视了
优化方向
http://blog.csdn.net/sjtuyunlei/article/details/6629357 http://acm.swust.edu.cn/algwiki/doku.php?id=usaco:1:5:prime_palindromes
取整与取余
double modf (double, double*); 将参数的整数部分通过指针回传, 返回小数部分
double fmod (double, double); 返回两参数相除的余数
两个double之间判断是否相等,不能用==,目前最优的方案是做差。
if (fabs(result1 - result2) < FLT_EPSILON)
printf( "equals\n ");
详见 45楼 http://topic.csdn.net/t/20061104/21/5133629.html#
判断一个int数是否为回文
int main() { int m,n,i,j,k,c=0; cin>>m>>n; for(i=m;i<=n;i++) { for(j=i,k=0;j;j/=10) //这个循环就是求反序数的部分 k=k*10+j%10; if(k==i) c++; } cout<<c<<endl; return 0; }
取一个double的整数部分——
1、直接赋值给整数变量。如:
inti=2.5;或i=(int)2.5;
这种方法采用的是四舍五入,不适用于你的问题。
2、使用floor函数。floor(x)返回的是x的整数部分。如:
floor(2.5)=2
floor(-2.5)=-2
3、使用ceil函数。ceil(x)返回的是不大于x的最小整数。如:
ceil(2.5)=2
ceil(-2.5)=-3
floor和ceil对于正数没有区别,但是对于负数结果不同。
如果你只是想简单的不用科学计算法来表示一个数,那么在输出的时候用
cout<<std::fixed<<yournumber;
这样就可以了,注意要包含<iomanip>头文件
我的第一版本代码(cao,今天才知道c++里int类型可以表达到2^32,原来只能表示到3万多的那个是short int),从a到b,一个个先判断是否回文数,然后是否质数。test10超时……被无情的鄙视了
/* ID: wangxin12 PROG: pprime LANG: C++ */ #include <iostream> #include <fstream> #include <vector> #include <math.h> #include <string> using namespace std; int A, B; vector<int> ans; bool isPalindrome(int n); bool isPrime(int n); int main() { ifstream fin("pprime.in"); fin>>A>>B; cout<<A<<" "<<B<<endl; fin.close(); for(int i = A; i <= B; i += 1) { if(isPalindrome(i)) { if(isPrime(i)) ans.push_back(i); } } ofstream fout("pprime.out"); int j = 0; while(j < ans.size()) { fout<<std::fixed<<ans[j]<<endl; j += 1; } fout.close(); return 0; } bool isPalindrome(int index) { bool flag = false; int m = 0, n = index; for(m = 0; n > 0; n = n / 10) { m = m * 10 + n % 10; } if( m == index ) flag = true; return flag; } //bool isPalindrome(double index) { // bool flag = false; // // double m = 0, n = index; // for(m = 0; fabs(n - 0) > 0.0000001; n = floor(n / 10)) { // m = m * 10 + fmod(n, 10); // } // if( fabs(m - index) < 0.000001 ) flag = true; // // return flag; //} bool isPrime(int n) { bool flag = true; int start = 2; int end = sqrt((double)n); for(int i = start; i <= end; i++) { int mod = n % i; if( mod == 0) { flag = false; break; } } return flag; } //bool isPrime(double n) { // bool flag = true; // // double start = 2; // double end = floor(sqrt(n)); // for(double i = start; i <= end; i++) { // double mod = fmod(n ,i); // if( fabs(mod - 0) < 0.0000001) { // flag = false; // break; // } // } // // return flag; //}
优化方向
http://blog.csdn.net/sjtuyunlei/article/details/6629357 http://acm.swust.edu.cn/algwiki/doku.php?id=usaco:1:5:prime_palindromes
/* ID: wangxin12 PROG: pprime LANG: C++ */ #include <iostream> #include <fstream> #include <vector> #include <math.h> #include <string> using namespace std; vector<int> palindromes; int A, B; void genOdd(); void genEven(); bool isPrime(int n); void Sort(vector<int> &vec); void Merge(vector<int> &vec, vector<int> &v1, vector<int> &v2); int main() { ifstream fin("pprime.in"); fin>>A>>B; cout<<A<<" "<<B<<endl; fin.close(); //collecting all the odd digit palindromes genOdd(); //collecting all the odd digit palindromes, actually ,we can only add 11,cause others are not prime //getEven(); palindromes.push_back(11); Sort(palindromes); ofstream fout("pprime.out"); for(int k = 0; k < palindromes.size(); k++) { int temp = palindromes[k]; if(temp >= A && temp <=B) { if(isPrime(temp)) fout<<temp<<endl; } } fout.close(); return 0; } void genOdd() { for(int i = 5; i <= 9999; i++) { int n = i, j = i / 10; while(j) { n = n * 10 + j % 10; j /= 10; } palindromes.push_back(n); } } void genEven() { for(int i = 5; i <= 9999; i++) { int n = i, j = i; while(j) { n = n * 10 + j % 10; j /= 10; } palindromes.push_back(n); } } bool isPrime(int n) { if(n % 2 == 0 && n > 2) return false; if(n > 5 && n % 5 == 0) return false; bool flag = true; int start = 2; int end = sqrt((double)n); for(int i = start; i <= end; i++) { int mod = n % i; if( mod == 0) { flag = false; break; } } return flag; } void Sort(vector<int> &vec) { int n = vec.size(); if(n <= 1) return; // already sorted vector<int> v1, v2; int i = 0; while(i < n) { if(i < n/2) { v1.push_back(vec[i++]); } else { v2.push_back(vec[i++]); } } Sort(v1); Sort(v2); vec.clear(); Merge(vec, v1, v2); } void Merge(vector<int> &vec, vector<int> &v1, vector<int> &v2) { int n1 = v1.size(); int n2 = v2.size(); int p1 = 0; int p2 = 0; while(p1 < n1 && p2 < n2) { if(v1[p1] <= v2[p2]) { vec.push_back(v1[p1++]); } else { vec.push_back(v2[p2++]); } } while(p1 < n1) vec.push_back(v1[p1++]); while(p2 < n2) vec.push_back(v2[p2++]); }
相关文章推荐
- USACO Section 1.5 Prime Palindromes
- USACO1.52 Prime Palindromes
- USACO 1.5-Prime Palindromes
- usaco - Prime Palindromes
- USACO-Prime Palindromes
- luogu P1217 [USACO1.5]回文质数 Prime Palindromes
- USACO-Section1.5 Prime Palindromes
- USACO Section 1.5 Prime Palindromes
- USACO section 1.5.2 Prime Palindromes
- USACO:Prime Palindromes
- USACO1.5 回文质数 Prime Palindromes
- 回文数多还是质数多,谈USACO回文质数题Prime Palindromes
- USACO-Prime Palindromes(部分筛法判素数,回文数生成)
- USACO-Section1.5 Prime Palindromes【暴力枚举】
- USACO section 1.5.2 Prime Palindromes
- 【USACO 1.5】Prime Palindromes
- [USACO1.5]回文质数 Prime Palindromes(暴力枚举)
- P1217 [USACO1.5]回文质数 Prime Palindromes(#1 - 6)
- P1217 [USACO1.5]回文质数 Prime Palindromes
- usaco Prime Palindromes