求前n项和 , 要求不用乘除,循环,判断 (三种方法)

来源:互联网 发布:人脸比对系统源码 编辑:程序博客网 时间:2024/05/16 08:08

题目:

题目:求 1+2+ … +n,要求不能使用乘除法、 forwhileifelseswitchcase 等关键字以及条件判断语句( A?B:C)。

方法1:用递归替代循环,结合短路特性退出递归

针对循环可以用递归来替代,而针对递归的结束可以用n&&(fun())来代替,因为一旦n等于0则不会执行后面的代码了

int addtion(int n){           int ans = n;           ans &&(ans += addtion( n-1));           return ans;}

方法二:利用类的构造函数,创建一个类对象数组,构造函数就会被调用多次,以此代替循环

class Temp{    public:      Temp() { ++N; Sum += N; }      static void Reset() { N = 0; Sum = 0; }      static int GetSum() { return Sum; }    private:      static int N;      static int Sum;};//类外初始化静态变量int Temp::N = 0;int Temp::Sum = 0;int solution1_Sum(int n){      Temp::Reset();      Temp *a = newTemp[n];      delete []a;      a = nullptr;//清理指针指向内存后,指针一定要指向nullptr才行      return Temp::GetSum();}

第三种方法:公式n*(n+1)/2,但是有乘除法,实现乘法可以用sizeof多维数组,除法除以2用位移很容易

class Solution {public:    int Sum_Solution(int n) {        bool a[n][n+1];        return sizeof(a)>>1;//这个牛,但只是GCC的特性呀,标准C++并不支持的,比如vs就不能编译的    }};
0 0