ZOJ Problem Set - 1331 Perfect Cubes 判断一个double是否为整数
zju对时间要求比较高,这就要求我们不能简单地暴力求解(三个循环搞定),就要换个思路:因为在循环时,已知a,确定b,c,d,在外重两层循环中已经给定了b和c,我们就不用遍历d,我们可以利用d^3=a^3-b^3-c^3来判断这个d。
看代码:
#include <stdio.h> #include <math.h> int main() { for(int n=2;n<=200;++n) { int a[200],b[200],c[200],count=0,i,flag=0; double result=pow(n,3); for(i=2;i<n;i++) { int ai= i*i*i; for(int j=i+1;j<n;j++) { int bj= j*j*j; if(ai+bj>result) break; double t=result-ai-bj; double ck=pow(t,1.0/3.0); int val; int v = (int)ck; bool ans = false; if(v*v*v + bj + ai == n*n*n){ ans = true; val = v; } if((v-1)*(v-1)*(v-1) + bj + ai == n*n*n){ val = v-1; ans = true; } if((v+1)*(v+1)*(v+1) + bj + ai == n*n*n){ val = v+1; ans = true; } if(ans && val>1 && val> (i<j?j:i)) { a[count]=i; b[count]=j; c[count++]=val; flag=1; } } } if(flag) { for(i=0;i<count;i++) printf("Cube = %d, Triple = (%d,%d,%d)\n",n,a[i],b[i],c[i]); } } return 0; }
这里存在一个比较有争议的话题,就是如何判断一个double为一个整数,经过跟实验室同学来回实验,提炼出一个在c/c++中可以判断的方法:
bool isInt(double a) { int aInt=int(a); if(aInt+1==a||aInt-1==a||aInt==a) return true; else return false; }
在利用了pow函数时,其返回值是double类型,这个函数是可以判断其是否为整数,其他情况有待实验
另外:给自己的提醒,三目运算符放在判断语句中一定要加括号,要不会有错误