剑指offer--求1+2+……+n

本文探讨了在不使用循环与条件语句的情况下求1到n的和的方法,包括利用数学公式、逻辑与短路特性实现递归、构造函数、虚函数及函数指针等多种创新思路。
题目描述:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

本题主要是想考察应聘者的发散思维,以及编程技术的宽度,在实际开发过程中不会有这样苛刻的限制。我们来提供一下几种思路解决本题:
- 利用数学公式

int sum_solution1(int n)
    {
        bool a[n][n + 1];
        return sizeof(a) >> 1;
    }

这个思路是基于1+2+……+n的数学公式是(n+(n+1))/2

  • 利用逻辑与的短路特性实现递归终止
int sum_solution2(int n)
{
    int sum = 0;
    bool ans = (n > 0) && ((sum += sum_solution(n - 1)) > 0);
    return sum;
}

1.当n == 0时,(n>0) && ((sum += Sum_Solution(n - 1))>0)只执行前面的判断,为false,然后直接返回0;
2.当n>0时,执行sum += Sum_Solution(n - 1),实现递归计算Sum_Solution(n)。

上面的两种方法其实有些投机取巧,实际上按照严格要求并不完全符合题意(但是可以编译过哦,在面试中可以先给面试官写这两种方法,如果面试官还不满意)下面再介绍四种比较稳妥的方法!

  • 利用构造函数求解
class Temp
{
public:
    Temp()
    {
        N++;
        sum += N;
    }

    static void Reset()
    {
        N = 0;
        sum = 0;
    }
    static unsigned int Getsum()
    {
        return sum;
    }
private:
    static unsigned int N;
    static unsigned int sum;
};

unsigned int Temp::N = 0;
unsigned int Temp::sum = 0;

unsigned int Sum_solution3(unsigned int n)
{
    Temp::Reset();

    Temp* a = new Temp[n];
    delete[] a;
    a = NULL;

    return Temp::Getsum();
}

思路:定义一个类型,然后再创建n个该类型的实例,那么该类型的构造函将会被调用n次。

  • 利用虚函数求解
class A;
A* arr[2];

class A
{
public:
    vritual unsigned int Sum(unsigned int n)
    {
        return 0;
    }
};

class B :public A
{
public:
    vritual unsigned int Sum(unsigned int n)
    {
        return arr[!!n]->Sum(n);
    }
};

int Sum_solution4(int n)
{
    A a;
    B b;
    arr[0] = &a;
    arr[1] = &b;

    int value = arr[1]->Sum(n);

    return value;
}

思路:
1.定义两个函数,一个函数充当递归函数,一个函数用来处理递归终止的情况,在操作时,我们只需要在两个函数里面任意选择一个即可,因此用bool类型。
2.true(1)时,调用第一个函数,false(0)时,调用第二个函数。
3.对n连续两次做反运算,即!!n,则非零的n转换为true,零转换为false。

  • 利用函数指针求解
typedef unsigned int(*fun)(unsigned int);

unsigned int Solution(unsigned int n)
{
    return 0;
}

unsigned int sum_solution5(unsigned int n)
{
    static fun f[2] = { Solution, sum_solution5 };
    return n + f[!!n](n - 1);
}

不使用虚函数时,即C语言中用函数指针来模拟。

  • 利用模板类型求解
template <unsigned int n> struct Sum_Solution6
{
    enum Value
    {N = Sum_Solution6<n-1>::N+n};
};

template <> struct Sum_Solution6<1>
{
    enum Value{N=1};
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值