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));
}
2021年目標:完成新書《聞缺陷則喜》,本博客右上公告有下載、閱讀鏈接,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/557028.html
標籤:其他
上一篇:資料結構鏈表的基本操作
下一篇:返回列表
