首页 > 其他分享 >判断是否是完全平方数[容易]和排列箱子[容易]

判断是否是完全平方数[容易]和排列箱子[容易]

时间:2023-07-11 19:45:27浏览次数:50  
标签:平方 right int 是否是 mid assert 容易 BoxLeve left

1.1.1. 完全平方数(PerfectSquare

判断正整数y是否是完全平方数。如果能找到正整数x,使得x*x==y,则y是平方数。

1. 思路

条件

处理

x*x>y

丢弃右半部分

x*x==y

y是完全平方数

x*x<y

丢弃左半部分

x的取值范围是[1,y],我们用左闭右开空间,就是[1,y+1)。

注意:计算过程要注意溢出。

扩展:如果y是自然数呢?y可以为0。

 

代码

 

#include <iostream>
#include <vector>

bool IsPerfectSquare(int y )
{
    int left = 1, right = y + 1;
    while (right - left > 1)
    {
        int x = left + (right - left) / 2;
        if (x * x == y)
        {
            return true;
        }
        else if (x * x > y)
        {
            right = x;
        }
        else
        {
            left = x;
        }
    }
    return left * left == y;
}
int main()
{
    std::vector<int> v;
    for (int i = 1; i < 1000; i++)
    {
        if (IsPerfectSquare(i))
        {
            v.emplace_back(i);
        }
    }
    for (const auto& n : v)
    {
        std::cout << n << " ";
    }
}

1.1.1. 排列箱子

有n个箱子,求可以排列多少行(包括不完整行)。第一行1个箱子,第二行2个箱子...第i行i个箱子。注意:最后一行可能没满,除最后一行外其他行全满。

1. 解题思路

m行排满,共有maxN= m*(1+m)/2个箱子。

m行只排一个,共有minN = maxN-m+1个箱子。

如果n小于minN,则抛弃右边;

如果n大于maxN,则抛弃左边。

边界[1,n],左闭右开空间是[1,n+1)

 

代码

 

#include <iostream>
#include <assert.h>

 

int BoxLeve(int n)
{
int left = 1, right = n + 1;
while (right - left > 1)
{
int mid = left + (right - left) / 2;
int maxN = (1 + mid)* mid / 2;
int minN = maxN - mid + 1;
if (n < minN)
{
right = mid;
}
else if (n > maxN)
{
left = mid;
}
else
{
return mid;
}
}
return left;
}
int main()
{
assert(1 == BoxLeve(1));
assert(3 == BoxLeve(4));
assert(3 == BoxLeve(5));
assert(3 == BoxLeve(6));
assert(4 == BoxLeve(7));
assert(4 == BoxLeve(10));
//assert(51 == BoxLeve(11));
}

 

 

  

 

标签:平方,right,int,是否是,mid,assert,容易,BoxLeve,left
From: https://www.cnblogs.com/he-zhidan/p/17545745.html

相关文章

  • 关于数据治理一些容易混淆的概念
    容易混淆的数据治理的概念1、数据管理是不是数据治理不是、数据管理和数据治理的区别是数据管理包含数据治理,广义的数据治理和数据管理范围一样,目前国内大部分说的是广义的数据治理,数据治理是等于数据管理,但是国外数据治理是指制订治理规范,保障数据管理能够顺利完成的工作,是侠......
  • Find a way bfs搜索 容易出错
    题目链接:题意:给你一个图,图中有不能走的障碍物,和两人,以及n个(n>=1)KFC,现在要求找到其中一个KFC,让两个人人走到这个KFC的时间总和最小;#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<vector>#include<queue>......
  • 【Catasult Shooting】打弹弓容易也不容易
    我原以为弹弓较难在中距离上实现精确射击,因为当时我采用的是竖握瞄打方式,具体是左手竖握弓体,让弹丸,弓门中点和目标处于一条直线上,用右眼进行校准。这种方式因为弓门中点是虚点,超过3米就容易失去准头。后来我接触了横握瞄打,发现中距离也能实现较精准射击。具体来说是左手横握弓体,让......
  • 泪目!跳槽太不容易,蚂蚁金服三轮面试,四个小时灵魂拷问
    本人是双非院校科班研究生,Java开发3年工作经验,以下是最近的面试总结:先说下我的面试准备经历,为了保证自己简历有较大一定的概率通过筛选,我在2018毕业后面试了多家公司,去了一家上海一家小公司一直工作到今年5月。和往年相比,今年的金三银四看上去不是那么顺利,可能和我的准备不足有......
  • Android知识笔记:记录 2 个 “容易误解” 的Android 知识点
    今天分享两个之前我们可能都搞错的Android知识点,我们还是要追求极致,把不懂的问题搞懂的~1.事件到底是先到DecorView还是先到Window的?有天早上看到事件分发的一个讨论:那么事件到底是先到DecorView还是先到Window(Activity,Dialog)的呢,引发出两个问题:1.touch相关事件在DecorView,Phon......
  • JAVA判断是否是IDEA里启动
      /***判断是否是idea里面启动*@returntrue:是false:否*/privatestaticbooleancheckRunInIDEA(){try{Class.forName("com.intellij.rt.execution.application.AppMainV2");returntrue;}cat......
  • spring中的bean是否是线程安全的
    Spring中的bean是否线程安全,与Spring本身是无关的。Spring中会提供很多线程安全方面的策略,因此Spring中的bean也不具备线程安全的特性在Spring的作用域中,有以下几种;prototype(多例)每次getBean得到时候都会创建一个新的对象singleton(单例)在Spring容器中只存在一个全局共......
  • JavaScript program to check if a given year is leap year Javascript判断是否是闰
    Ayearisleapyeariffollowingconditionsaresatisfied:Yearismultipleof400.Yearismultipleof4andnotmultipleof100.Approach: Getthevalueofinputfieldbyusingdocument.getElementById(“year”).valueCheckthegivenyearisleapyear......
  • 武汉星起航:新手卖家要想做好亚马逊,英语是否是必备技能?
    随着亚马逊(Amazon)成为全球最大的在线零售平台之一,越来越多的人加入其中,希望成为亚马逊卖家并实现商业成功。然而,对于新手卖家而言,一个常见的问题是:是否需要精通英语?让我们一起探讨在亚马逊平台上做生意是否需要掌握英语这一问题。首先,值得注意的是,亚马逊平台提供了多种语言界面,包括......
  • PAT_Advanced Level_1078 Hashing (25分)(C++_Hush_平方探测法)
    Thetaskofthisproblemissimple:insertasequenceofdistinctpositiveintegersintoahashtable,andoutputthepositionsoftheinputnumbers.ThehashfunctionisdefinedtobeH(key)=key%TSizewhereTSizeisthemaximumsizeofthehashtable.Qu......