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