您的位置:首页 > 编程语言 > C语言/C++

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数是否为回文

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++]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  merge math.h c++ equals n2 算法