《剑指Offer》Java刷题 NO.47 求1到n的和(&&短路特性、位运算、异常处理机制、快速幂分解实现乘法)

    技术2022-07-10  168

    《剑指Offer》Java刷题 NO.47 求1到n的和(&&短路特性、位运算、异常处理机制、快速幂分解实现乘法)

    传送门:《剑指Offer刷题总目录》

    时间:2020-06-29 题目: 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。


    思路: 单纯的思维开阔题: 方法一:利用利用短路 特性&& 来实现 if的功能,递归计算 方法二:利用Java异常退出实现递归。为递归退出设置1%n除0异常。 方法三:快速幂分解: 关于如何递归实现ab,有大佬总结过:利用位运算来做,快速幂,快速模乘, 原理是把a拆成2的幂的和,a = 2^e0 + 2^e1 + 2^e2… 那么 a * b = (2^e0 + 2^e1 + 2^e2+…) * b = b * 2^e0 + b * 2^e1 + b * 2^e2 + … = (b << e0) + (b << e1) + … 例如:a=5=101=20+23 ab=b*20+b*23=(b<<0)+(b<<3)


    Java代码

    /** * @author LiMin * @Title: SumOf1ToN * @Description: 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 * @date 2020/6/30 9:34 */ public class SumOf1ToN { public static void main(String[] args) { SumOf1ToN sumOf1ToN = new SumOf1ToN(); System.out.println(sumOf1ToN.sumOf1ToNThree(1)); } /** * 利用&&短路特性表示if,实现递归 */ public int sumOf1ToNOne(int n) { int sum = n; boolean flag = (n > 0) && (sum += sumOf1ToNOne(n - 1)) > 0;//这里加上boolean完全是为了不报错 return sum; } /** * 利用Java异常处理机制,除以0为截至条件,实现递归 */ public int sumOf1ToNTwo(int n) { try { int i = 1 % n;//当n==0时会抛出异常 return n + sumOf1ToNTwo(n - 1); } catch (Exception e) { return 0;//当n==0时返回0 } } /** * 快速幂算法实现两数相乘 */ public int sumOf1ToNThree(int n) { return multi(n, n + 1) >> 1; } public int multi(int a, int b) { int result = 0; //利用短路特性模拟if boolean flag1 = ((a & 1) == 1) && (result += b) > 0;//a的当前最低位为1时才加上b a >>= 1;//a/2 b <<= 1;//b*2; //利用短路特性模拟while boolean flag2 = (a != 0) && (result += multi(a, b)) > 0; System.out.println(result); return result; } }
    Processed: 0.072, SQL: 9