USACO Prime Palindromes

两个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++]);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值