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

【第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<=2311
进阶:你能不使用循环或者递归来完成本题吗?

初见

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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值