《C语言入门100例》(第2例) 给定 n,求 1 + 2 + 3 + ... + n 的和给定 n,求 1 + 2 + 3 + ... + n 的和

【第02题】给定 n,求 1 + 2 + 3 + … + n 的和 | 四种解法

文章目录

    • 主要知识点
    • 习题
      • 1. 剑指 Offer 64. 求1+2+…+n
        • 题目描述
        • 初见
        • 思路
        • 代码
      • 2. Sum Problem
        • 题目描述
        • 初见
      • 3. 剑指 Offer 57 - II. 和为s的连续正数序列
        • 题目描述
        • 初见
        • 思路
        • 代码
    • 总结

主要知识点

计算时注意数值计算在计算机内的溢出。与理论计算不同,算法设计中要时刻注意数值计算溢出的情况,以计算 n ∗ ( n + 1 ) / 2 n * (n + 1) / 2 n(n+1)/2 为例,通常有以下 3 种解决方法:

  1. 通过循环规避可能溢出的计算,将上式中的乘法通过循环降级为加法,规避 n ∗ ( n + 1 ) n * (n + 1) n(n+1) 可能产生的溢出;
  2. 通过改变计算顺序先规避可能的溢出,如先算一步除法再算乘法;
  3. 通过提升变量类型扩大内存规避溢出,如将 n n nint 扩展为 unsigned intlong long

计算机的数值计算在工程运用中是一个更加复杂的问题,不止需要考虑计算时变量类型导致的溢出,更需要考虑数值稳定性(尤其是迭代计算中的稳定性)。

习题

1. 剑指 Offer 64. 求1+2+…+n

题目描述

求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
限制:1 <= n <= 10000

初见

那么为什么不能用 n × ( n + 1 ) / 2 n \times (n + 1) / 2 n×(n+1)/2 呢?
初见败北。

思路

在上述条件限定下,编程中常用的运算符只剩下了加减法,位运算符,以及逻辑运算符。对于数列求和,常用的有两种方法:循环求和与公式计算。

  1. 从循环求和角度出发,要找到一种代替 if else 语句的写法,恰好逻辑运算符可以满足这一要求。由于逻辑运算符的短路特性,对于以下 if 语句:
    if (condA) {
        do A;
    } else {
    	do B;
    }
    
    其效果等价于:
    (condA) && (do A); // condA == true, 才执行 do A
    (!condA) && (do B); // condA == false, 才执行 do B
    
  2. 从公式计算的角度出发,我们可以用 x >> 1 完成 x / 2 x / 2 x/2 的计算,但是要找到一种代替乘法的方法。回顾一下这里,就会发现…只需要使用逻辑运算符,就可以替换原有的 if else 语句,将乘法以如下形式完成:
    int multiply(int A, int B) {
         int result(0);
         for (int i = 0; i < 32; ++i) {
             // 若 B 为奇数,则 result = result + A(通过 && 实现奇数条件进入)
             (B & 0x1) && (result += A);
             // 已解决 B 为奇数的情况,此时 B 为偶数
             A = (unsigned int)A << 1;
             B = B >> 1;
         }
         return result;
     }
    
    至于 for 循环…那么官方的说法是:不过 14 次而已( 1 ≤ n ≤ 10000 1 \leq n \leq 10000 1n10000),写就完事儿了!
代码

解法1:使用逻辑运算符代替 if else

你可能感兴趣的:(c++,leetcode)