• 剑指offer:求1+2+..+n


    题目描述

    求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
    一,利用利用短路 && 来实现 if的功能;
    二,利用递归来实现循环while的功能
     
    递归(使用&&的短路性质)
    class Solution {
    public:
        int Sum_Solution(int n) {
            int ans = n;
            ans&&(ans += Sum_Solution(ans-1));
            return ans;
        }
    };

     不使用乘法求乘法:

    把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) + ....
    利用循环求n*(n-1)/2
     
    int Sum_Solution(int n) {
        int a = n;
        int b = n+1;
        int result = 0;
        while(a){
            if(a&1){
                result += b;
            }
            a = a>>1;
            b = b<<1;
        }
        return result>>1;
    }
    class Solution {
    public:
        int Sum_Solution(int n) {
            int result = Sum_Solution(n,n+1);
            return result>>1;
        }
        int Sum_Solution(int a,int b) {
            int sum = 0;
            (a&1 == 1) && (sum += b);
            (a!=0) &&  (sum += Sum_Solution(a>>1,b<<1));
            return sum;
        }
    };
     
  • 相关阅读:
    5.21 CSS样式表练习
    5.20 c#验证码练习
    5.20 邮箱注册,及网页嵌套,知识点复习
    5.19 网页注册练习
    5.19练习标签及其 定义
    5.16 兔子生兔子,日期时间练习
    5.15 复习;共5题
    5.11 集合 与 特殊集合
    5.11 集合与特殊集合
    WinForm1
  • 原文地址:https://www.cnblogs.com/ttzz/p/13933915.html
Copyright © 2020-2023  润新知