力扣刷题记录1.5-----367. 有效的完全平方数


完成次数 2

一、题目

在这里插入图片描述

二、代码

class Solution {
public:
    bool isPerfectSquare(int num) {
    
     double left=0;
     double right=num;
     double middle=0;
     
     double last_consequence=-10;
     double now_consequence=-100;
     
     double return_num=0;
     
     bool bool_return_num=0;
     int cal_time=0;
     int last_left=0;
     int last_middle=0;
     int last_right=0;   

    //特殊处理:
     //二分逼近也要防止自身就是答案的情况
     if(num==1) bool_return_num=1;

     //一般情况
       if(bool_return_num==0)
       {
        
        //首先二分逼近平方根
        while(abs(last_consequence-now_consequence)>0.000000000001)
        {

            last_consequence= now_consequence;
            middle=(left+right)/2;
            cal_time=cal_time+1;
            if(middle*middle==num)  //相等直接退出
            {
                return_num=middle;
                last_left=0;
                last_middle=1;
                last_right=0;
                break;
            }
            
            if(middle*middle>num)    //大于  结果必定在左边
            {
                right=middle;
                now_consequence=abs(middle*middle-num);
                return_num=middle;
                last_left=0;
                last_middle=0;
                last_right=1;

            }

            if(middle*middle<num)
            {
                left=middle;  
                now_consequence=abs(middle*middle-num);
                return_num=middle;
                last_left=1;
                last_middle=0;
                last_right=0;
            }
    
        }

            std::cout<<"last_left  "<< last_left<<std::endl;
            std::cout<<"last_middle   "<<last_middle <<std::endl;
            std::cout<<"last_right   "<<last_right <<std::endl;

            std::cout<<cal_time<<std::endl;
            std::cout<<(int)return_num<<std::endl;
            std::cout<<return_num<<std::endl;

            std::cout<<return_num*return_num<<std::endl;     
            std::cout<<abs(return_num-(int)return_num)<<std::endl;
            
            std::cout<<"return_num   "<<return_num <<std::endl;

            std::cout<<"int(return_num+0.5000001)   "<<int(return_num+0.5) <<std::endl;
            
            if(abs(return_num-int(return_num+0.5000001))<=0.001)
            {
            bool_return_num=1;
            }
            else
            {
            bool_return_num=0;            
            }
        }

        std::cout<<bool_return_num<<std::endl;
        return bool_return_num;

    }
};

三、运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@白圭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值