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

来源:互联网 发布:淘宝的销售金额 编辑:程序博客网 时间:2024/05/21 06:18

解题分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态的限制。但这道题却能有效地考查发散思维能力,而发散思维能力能反映出对编程相关技术理解的深刻程度。

通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思路。由于已经明确限制for和while的使用,循环已经不能再用了。同样,递归函数也需要用if语句或者条件判断语句来判断是继续递归下去还是终止递归,但现在题目已经不允许使用这两种语句了。

方法一:利用C++定义一个类,我们new一含有n个这种类型元素的数组,那么该类的构造函数将确定会被调用n次。我们可以将需要执行的代码放到构造函数里,那么创建对象时就会调用构造函数;

class Sum
{
private:
    static int N;
public:
     Sum()
     {
         ++N;
         sum+=N;
     }
     static int sum;
};
int Sum::N = 0;
int Sum::sum = 0;
int main()
{
    Sum *s = new Sum[100];
    delete []s;
    cout << s->sum <<endl;
    return 0;
}

方法二:递归的思想;

利用递归1
class A;
A *array[2];
class A
{
public:
    virtual int sum(int n){return 0;}//创建一个接口
};
class B : public A
{
  public:
    virtual int sum(int n){return array[!!n]->sum(n-1)+n;}//对n两次取反
};
int main()
{
    A a;
    B b;
    array[0] = &a;
    array[1] = &b;
    int value = array[1]->sum(10);
    cout << value <<endl;
}
//利用递归2
template <int n>struct Sum1
{
    enum Value{N = Sum1<n-1>::N + n};
};
template <> struct Sum1<1>
{
    enum Value{N = 1};
};
int name()
{
    Sum1<10> sum;
    cout << sum1.Value <<endl;
    return 0;
}

1 0
原创粉丝点击