寫在前面
- 積累新的方式方法
- 腦子轉不動了,扯皮扯的心好累,,,
題目詳情
給定一個正整數 num,編寫一個函數,如果 num 是一個完全平方數,則傳回 True,否則傳回 False。
說明:不要使用任何内置的庫函數,如 sqrt。
示例 1:
輸入:16
輸出:True
示例 2:
輸入:14
輸出:False
- 新增知識點
-
boolalpha 可以使用單詞"true"和"false"進行輸入/輸出的布爾值.
-
boolalpha是頭檔案#include <iostream>中的一個函數,是把bool a = 1;
- 測試代碼
#include <iostream> using namespace std; int main() { bool flag = 1; // 輸出值: 1 cout << flag << endl; // 輸出值: true cout << boolalpha << flag << endl; return 0; }
-
ac代碼
-
1. 二分法
class Solution {
public:
bool isPerfectSquare(int num)
{
long long left = 0,right = num;
long long squ, mid;
while (left <= right)
{
mid = (left + right) / 2;
squ = mid * mid;
if (squ == num)
return true;
else if (squ > num)
right = mid - 1;
else
left = mid + 1;
}
return false;
}
};
-
2. 局部疊代
- 通過調試了解代碼運作狀态
- 注意循環終止條件
class Solution {
public:
bool isPerfectSquare(int num) {
if(num == 1) return true;
for(long long i = 2; i*i <= num; i ++){
if(num%(i*i) == 0) {
num = num/(i*i);
i = 1;
}
}
if(num == 1) return true;
return false;
}
};
-
3. 普通解法
class Solution {
public:
bool isPerfectSquare(int num)
{
if(num == 1)
return true;
bool flag = false;
for(long long i = 2; i*i <= num; i ++)
{
if(i*i == num) {
flag = true;
break;
}
}
return flag;
}
};
- 測試運作
#include <iostream>
using namespace std;
bool isPerfectSquare(int num)
{
if(num == 1)
return true;
bool flag = false;
for(long long i = 2; i*i <= num; i ++)
{
if(i*i == num)
{
flag = true;
break;
}
}
return flag;
}
int main()
{
cout << boolalpha << isPerfectSquare(16);
return 0;
}
- 參考文章
- LeetCode 367. 有效的完全平方數
- LeetCode 367.有效的完全平方數(C++)