logo头像

野渡's小小知识乐园

5.限制条件求和

开一下脑洞

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

1、题目描述

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

2、解题思路

(1)常规解法

这个题《剑指offer》提出了四种解法,分别如下:

  • 函数指针: 指针数组指向两个函数,!!n进行下标选择
  • 模板: 指定参数和不指定参数
  • 构造函数: 构造函数每次一个静态变量+k,构造n个对象
  • 虚函数: 父子类同一个方法,分别做累加和返回0,基类对象指针数组选择对应的虚函数进行求值

(2)有意思的解法

  • pow函数:直接用pow函数进行求解

    1
    2
    3
    4
    5
    6
    7
    class Solution {
    public:
    int Sum_Solution(int n)
    {
    return static_cast<int>(pow(n,2)+n)>>1;//直接求结果n(n+1)/2
    }
    };
  • 判断条件求解:通过隐式调用条件判断进行求解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Solution {
    public:
    int Sum_Solution(int n)
    {
    int ans = n;
    ans && (ans += Sum_Solution(n - 1)); //这里隐式调用了条件判断,不为0就递归
    return ans;
    }
    };
  • 等价替换:用一些等价操作来进行替换,从而实现转换操作

    1
    2
    3
    4
    5
    6
    7
    8
    class Solution {
    public:
    int Sum_Solution(int n) //等价于求n(n+1)/2
    {
    bool a[n][n+1]; //等价于求n(n+1)
    return sizeof(a)>>1; //等价于上述结果除2
    }
    };
  • 抛出异常:用异常来作为作为结束条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Solution {
public int Sum_Solution(int n)
{
return sum(n);//递归求和
}
int sum(int n)
{
try
{
int i = 1%n; //n为0时出现异常
return n+sum(n-1);
}
catch(Exception e){ return 0;} //捕获异常并返回
}
}