剑指offer 面试题46:求1+2+3+...+n(不能使用乘除法、循环语句及条件判断语句) 题解

时间:2022-06-10 02:04:25
剑指offer 面试题: 求1+2+3+...+n


参与人数:2426  时间限制:1秒  空间限制:32768K

题目描述

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


分析:
方法1:  短路与&&、短路或|| + 递归
不能用判断语句的关键字,但是能想到短路与&&、短路或||的特性:如果 || 前面一个为真,则||后面的不会再执行,如果 && 前面一个为假,则&&后面的不会再执行。

AC代码:
#include <iostream>
using namespace std;
class Solution {
public:
    int Sum_Solution(int n) {
        int res=n;
        res&&(res += Sum_Solution(n-1));
        return res;  // n=0时,累加和为0
    }
};
// 以下为测试部分
/* 
int main()
{
	Solution sol;
	cout<<sol.Sum_Solution(3)<<endl;
	return 0;
}
*/



方法2: 使用二维数组+sizeof操作符+位操作
由于计算结果比较容易得到,即为 n(n+1)/2,故若选取占用1个Byte的 bool (或 char )型数组arr[n][n+1],则sizeof(char)*n(n+1)>>1即为所求,如果选取占用 4个Byte的int 型数组arr[n][n+1],则 sizeof(int)*n(n+1)>>3即为所求。不过由于char可能会在不同的编译器上占的字节数不一样,不建议使用。本人选用了int型二维数组来解决。

AC代码:
class Solution {
public:
    int Sum_Solution(int n) {
        int a[n][n+1];
        return sizeof(a)>>3;
    }
};



方法3:使用构造函数

方法4:使用函数指针

方法5:使用虚函数

方法6:使用模板函数(C++、Java等支持泛型)


后面4种方法来自于剑指offer原书2014版,暂时没弄太懂,有空了再琢磨琢磨...