全题为不能用乘除法,while for if else switch 条件判断语句等实现
1+2+3+...+n
首先不难想到的是编译期求解,即使用模板
code如下:
- /*
- * Copyright (c) 2011 alexingcool. All Rights Reserved.
- */
- #include <iostream>
- using namespace std;
- template<int n>
- class plus {
- public:
- enum value { result = plus<n - 1>::result + n };
- };
- template<>
- class plus<1> {
- public:
- enum value { result = 1 };
- };
- void main()
- {
- class plus<100> plus;
- cout << "plus.result = " << plus.result << endl;
- }
本方法有两个极大的缺陷:其一,class plus<100> plus里的100是手动设定的;其二,本题的实质是递归,但和递归不一样的是编译期求解,所以深度是有限的,试了下class plus<1000> plus就已经出问题了。
上述方法实质上属递归,普通递归也是可以实现的,不过方法很蛋疼,基本是想不出来的,code如下
- #include <iostream>
- using namespace std;
- int recurPlus(int n)
- {
- //i = 1是必须的,当n = 1的时候返回i需要初值
- int i = 1;
- (n > 1) && (i = recurPlus(n - 1) + n);
- return i;
- }
- void main()
- {
- int i = recurPlus(100);
- cout << "i = " << i << endl;
- }
下面一个方法是利用类的构造函数来实现,这个比较容易理解:
- #include <iostream>
- using namespace std;
- class Plus
- {
- public:
- Plus() { ++i, sum += i; }
- //去掉下面的reset函数试试
- static void reset() { i = 0; sum = 0; }
- //去掉下面的static关键字试试
- static int getSum() { return sum; }
- private:
- static int i;
- static int sum;
- };
- int Plus::i = 0;
- int Plus::sum = 0;
- int cacSum(int n)
- {
- //只有static函数才能如此调用
- Plus::reset();
- Plus *test = new Plus[n];
- delete[] test;
- return Plus::getSum();
- }
- void main()
- {
- int i = 100;
- int result = cacSum(i);
- cout << "result = " << result << endl;
- result = cacSum(i);
- cout << "result = " << result << endl;
- }
网上还有一种利用虚函数的解法,更蛋疼
- #include <iostream>
- using namespace std;
- 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; }
- };
- int cacSum(int n)
- {
- A a;
- B b;
- Array[0] = &a;
- Array[1] = &b;
- int value = Array[1]->Sum(n);
- return value;
- }
- void main()
- {
- int i = 2;
- int result = cacSum(i);
- cout << "result = " << result << endl;
- }