【第06题】给定两个点的坐标 (x1, y1) 和 (x2, y2),求两点间的距离 | 浮点数精度问题
主要知识点
math.h
头文件很有用,然后,题,题,题!
习题
1. Leetcode 326. 3 的幂
题目描述
给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x
提示: − 2 31 < = n < = 2 31 − 1 -2^{31} <= n <= 2^{31} - 1 −231<=n<=231−1
进阶:你能不使用循环或者递归来完成本题吗?
初见
既然是初见,那么必然要试一试直球啦!先将进阶和提示放在一边,根据幂的定义,我们可以写出以下代码:
bool isPowerOfThree(int n) {
if (n == 0) {
return false;
}
int mod = n % 3;
while (mod == 0) {
n /= 3;
mod = n % 3;
}
if (n == 1) { // 这里排除了负数情况
return true;
} else {
return false;
}
}
编码,提交,过啦!那么,能摆脱循环吗?
思路
- 暴力方法
看看提示 − 2 31 < = n < = 2 31 − 1 -2^{31} <= n <= 2^{31} - 1 −231<=n<=231−1 也就是说对 2 2 2 而言,只需要判断 31 31 31 次就可以判断完全部的 2 2 2 的幂。那么对 3 3 3 而言,只需要判断 19 19 19 次。 - 数学方法
由于输入存在范围限制,因此求出 3 3 3 在该范围中最大的幂 3 y 3^y 3y,对于任意的 3 x 3^x 3x 而言,必然有 3 y % 3 x = = 0 3^y \% 3^x == 0 3y%3x==0。通过该方法,判断输入的 n n n 能否整除 3 y 3^y 3y 即可。
代码
解法 1:暴力解法
bool isPowerOfThree(int n) {
int a = 3;
if (n == 1 || n == a) {
return true;
}
if (a > n) {
return false;
}
if (n == (3*a)) {
return true;
}
a *= 3;
// 再来 17 次
if (a > n) {
return false;
}
return false;
}
解法 2:数学方法
bool isPowerOfThree(int n) {
if (n <= 0) { // 规避负数与 0
return false;
}
int pow20Result = pow(3, 19); // 3^y
return pow20Result % n == 0? true: false; // 取模
}
总结
- 与数学不同,算法输入是有边界的,注意这一点就不难想到将一般的幂次方转换为最大幂次方的约数。