完全平方数题解

完全平方数

https://ac.nowcoder.com/acm/problem/14733

题目描述
多次查询[l,r]范围内的完全平方数个数
定义整数x为完全平方数当且仅当可以找到整数y使得y*y=x

输入
先输入一个整数N,接下来N行,每行输入一个范围;

输出
一个整数,范围中的完全平方数的个数;

思路:
我们需要的是l,r之间能够开方并且开方结果为整数的数,那么我们就可以反其道而行之,把l,r分别开方,求之间的整数的个数即可;虽然:我们可以使用stl中的upper_bound以及lower_bound直接进行运算,但是为了锻炼自己的代码能力所以还是自己手打一下这两个函数吧;
因为按照题目来的,所以我写的lower与upper与stl中的有所差异。

lower:

int lower(int l,int r,int number){
    int mid=(l+r)>>1;
    while(l<=r){
        mid =(l+r)>>1;//mid要随l,r的变化而更新;
    if(mid>=number)    r=mid-1;//因为找的是最左边的该数值,所以即使等于也要左移,直到最左边为止。
    else {
        l=mid+1;
    }    
    }
    return l;    
} 

upper
类似于lower就不做过多解释了;

int upper(int l,int r,int number){
//    cout<<number<<endl;
    int mid =(l+r)>>1;
    while(l<=r){
        mid =(l+r)>>1;
        if(mid>number)r=mid-1;
        else{
        l=mid+1;
        } 
    } 
    return l;
}

最后就是AC代码了

#include<iostream>
#include<cmath>
using namespace std;
const int type=36125;

int lower(int l,int r,int number){
    int mid=(l+r)>>1;
    while(l<=r){
        mid =(l+r)>>1;
    if(mid>=number)    r=mid-1;
    else {
        l=mid+1;
    }    
    }
    return l;    
} 
int upper(int l,int r,int number){
    int mid =(l+r)>>1;
    while(l<=r){
        mid =(l+r)>>1;
        if(mid>number)r=mid-1;
        else{
        l=mid+1;
        } 
    } 
    return l;
}
int main(){
    int n;
    cin>>n;
    while(n--){
        int x,y;
        cin>>x>>y;
        int L,R;
        if(x-(int)sqrt(x)*(int)sqrt(x)>0){
        L=upper(0,type,sqrt(x));     
        }else{
        L=lower(0,type,sqrt(x));
        }

 R=upper(0,type,sqrt(y)); 

    int ans = max (R-L,0);

    cout<<ans<<endl;
    }
    return 0;
}

笱蒻一枚,有错请指教

全部评论

相关推荐

已oc&nbsp;云智断更了好几天,也有一些话想说,继续更新一篇云智timeline&nbsp;4.18&nbsp;一面&nbsp;半个小时后约二面&nbsp;4.21二面&nbsp;当晚&nbsp;约hr面&nbsp;4.23hr面&nbsp;4.30&nbsp;发offer之前美团的二面挂了,进入人才库,后面又被捞起来面试,4.30号&nbsp;美团又一面,现在还没出一面结果感觉也不报什么希望,就算一面过了,还有二面,我经不起深入拷打,唉,真的,好难五一躺平了五天,吃吃玩玩睡睡~还要担心毕业,科研更是难,唉暑期可能就到此为止了,后面没有时间在这个上面了,要抓紧时间做科研,为了后面能出去实习。大厂,秋招再见!!!有一些感慨:4.1是我的第一次面试,美团,面试的时候紧张到浑身发...
daisy9542:我今晚也是美团一面,已经第六次了。我也面了其他的,没拿到 offer。但我想开了,要按照自己的节奏来,找暑期转正然后秋招大杀四方并不是唯一的出路,其实还有很多选择的,有 0 实习最后秋招拿 offer 了,也有不选择互联网去国企的外企的,考编的,创业的。现在的失败不代表以后的路都是黑暗的,只不过可能运气还没降临到头上。所以现在要做的,就是放平心态,提升自己,通过面试了解到自己的优点和不足,争取下次机会来了能好好抓住
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务