• 计算1+2+ ... +n 的值


    参考:https://leetcode-cn.com/problems/qiu-12n-lcof/solution/qiu-12n-by-leetcode-solution/
    1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

    示例 1:

    输入: n = 3
    输出: 6
    

    示例 2:

    输入: n = 9
    输出: 45
    

    限制:

    • 1 <= n <= 10000

    解题思路1:使用逻辑运算表达式模拟判断条件,然后进行递归运算

    class Solution {
        public int sumNums(int n) {
            // 当n=0时,开始逐层返回n的值
            boolean  flag = n > 0 && (n += sumNums(n -  1)) > 0;
            return n;
        }
    }
    

    解题思路2: 计算 1+2+...+n 的求和公式为n * ( n + 1) / 2,因此可以使用下列的俄罗斯乘法模拟两数相乘,的到的最终值进行右移运算即可。

    /**
     * 俄罗斯乘法:计算35 * 72
     * 35 72
     * 17 144      35 >> 1      72  << 1
     * 8 288       17 >> 1      144 << 1
     * 4 576       8  >> 1      288 << 1
     * 2 1152      ...
     * 1 2304
     *
     * 从上到下,对每一行,若左边的数字若为奇数,则将右边的数字取出,累加。
     * 72+144+2304=2520
     * 累加的结果2520即为乘积。
     */
    public static int quickMulti(int a, int b) {
        int ans = 0;
        for (; b > 0; b >>= 1) {
            // 如果b为奇数,则累加a
            if ((b & 1) > 0) {
                ans += a;
            }
            a <<= 1;
        }
        return ans;
    }
    
    
    class Solution {
        public int sumNums(int n) {
            int ans = 0, A = n, B = n + 1;
            boolean flag;
    
            // 如果B为奇数,则对 A 进行累加
            flag = ((B & 1) > 0) && (ans += A) > 0;
            A <<= 1;
            B >>= 1;
    
            flag = ((B & 1) > 0) && (ans += A) > 0;
            A <<= 1;
            B >>= 1;
    
            flag = ((B & 1) > 0) && (ans += A) > 0;
            A <<= 1;
            B >>= 1;
    
            flag = ((B & 1) > 0) && (ans += A) > 0;
            A <<= 1;
            B >>= 1;
    
            flag = ((B & 1) > 0) && (ans += A) > 0;
            A <<= 1;
            B >>= 1;
    
            flag = ((B & 1) > 0) && (ans += A) > 0;
            A <<= 1;
            B >>= 1;
    
            flag = ((B & 1) > 0) && (ans += A) > 0;
            A <<= 1;
            B >>= 1;
    
            flag = ((B & 1) > 0) && (ans += A) > 0;
            A <<= 1;
            B >>= 1;
    
            flag = ((B & 1) > 0) && (ans += A) > 0;
            A <<= 1;
            B >>= 1;
    
            flag = ((B & 1) > 0) && (ans += A) > 0;
            A <<= 1;
            B >>= 1;
    
            flag = ((B & 1) > 0) && (ans += A) > 0;
            A <<= 1;
            B >>= 1;
    
            flag = ((B & 1) > 0) && (ans += A) > 0;
            A <<= 1;
            B >>= 1;
    
            flag = ((B & 1) > 0) && (ans += A) > 0;
            A <<= 1;
            B >>= 1;
    
            flag = ((B & 1) > 0) && (ans += A) > 0;
            A <<= 1;
            B >>= 1;
    
            return ans >> 1;
        }
    }
    
  • 相关阅读:
    python遍历文件夹下的文件
    python异常列表
    python判断指定路径是否存在
    PIL中文文档
    较好的验证码切图示例
    简单验证码识别与字符切割
    python 函数、模块、包及import导入方法
    python-opencv在有噪音的情况下提取图像的轮廓实例
    python 读取、保存、二值化、灰度化图片+opencv处理图片的方法
    findContours函数参数详解
  • 原文地址:https://www.cnblogs.com/code-duck/p/13772904.html
Copyright © 2020-2023  润新知