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类型,这个函数是可以判断其是否为整数,其他情况有待实验

另外:给自己的提醒,三目运算符放在判断语句中一定要加括号,要不会有错误

posted @ 2013-09-28 22:07  xlturing  阅读(450)  评论(0编辑  收藏  举报