0
点赞
收藏
分享

微信扫一扫

《C语言入门100例》(第6例)给定两个点的坐标 (x1, y1) 和 (x2, y2),求两点间的距离 | 浮点数精度问题

12a597c01003 2022-04-29 阅读 62
leetcodec++

【第06题】给定两个点的坐标 (x1, y1) 和 (x2, y2),求两点间的距离 | 浮点数精度问题

文章目录

主要知识点

math.h 头文件很有用,然后,题,题,题!

习题

1. Leetcode 326. 3 的幂

题目描述

初见

既然是初见,那么必然要试一试直球啦!先将进阶和提示放在一边,根据幂的定义,我们可以写出以下代码:

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;
    }
}

编码,提交,过啦!那么,能摆脱循环吗?

思路

  1. 暴力方法
    看看提示 − 2 31 < = n < = 2 31 − 1 -2^{31} <= n <= 2^{31} - 1 231<=n<=2311 也就是说对 2 2 2 而言,只需要判断 31 31 31 次就可以判断完全部的 2 2 2 的幂。那么对 3 3 3 而言,只需要判断 19 19 19 次。
  2. 数学方法
    由于输入存在范围限制,因此求出 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; // 取模
}

总结

  1. 与数学不同,算法输入是有边界的,注意这一点就不难想到将一般的幂次方转换为最大幂次方的约数。
举报

相关推荐

0 条评论