一つの面白いテーマはsumを計算します.
2640 ワード
原文の由来:http://zhedahht.blog.163.com/blog/static/2541117420072915131422/
ちょっと整理しました.
テーマはこのようです.計算は1からnに加えて、sum=1+2+3++n、乗除法、for、while、if、else、switch、caseなど及び条件判断と?オペレータ
文章と評論に対する分析を通して、次のような解法が出てきました.面白いのはこの問題ではなく、違う考え方と知識に対する深い理解にあります.
基本的にコードです.大体分かります.短いです.
ちょっと整理しました.
テーマはこのようです.計算は1からnに加えて、sum=1+2+3++n、乗除法、for、while、if、else、switch、caseなど及び条件判断と?オペレータ
文章と評論に対する分析を通して、次のような解法が出てきました.面白いのはこの問題ではなく、違う考え方と知識に対する深い理解にあります.
基本的にコードです.大体分かります.短いです.
#include <iostream>
#include <cmath>
using namespace std;
// : 1 n,sum = 1+2+3+...+n, ,for,while,if,else,switch,case ?:
// :C++ ,new n , n
class Temp {
public:
Temp() { ++n; sum = 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 solution_one(int n)
{
Temp::Reset();
Temp *a = new Temp[n];
delete []a;
return Temp::GetSum();
}
// : + +
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 solution_two(int n)
{
A a;
B b;
array[0] = &a;
array[1] = &b;
return array[1]->sum(n);
}
// ,
typedef int (*Fun)(int);
int _solution_two_another(int n)
{
return 0;
}
int solution_two_another(int n)
{
Fun f[2] = { _solution_two_another, solution_two_another };
return n + f[!!n](n-1);
}
// : , enum
template <int n>
struct solution_three
{
enum Value { N = solution_three<n-1>::N + n};
};
template <>
struct solution_three<1>
{
enum Value { N = 1 };
};
// : &&
int solution_four(int n, int &sum)
{
return n && (sum += n) && solution_four(n-1, sum);
}
// :
int solution_five(int n)
{
int sum = 0;
n && ( sum = n + solution_five(n-1) );
return sum;
}
// :
int solution_six(int n)
{
int tmp = exp( log(n) + log(n+1) );
return tmp >> 1;
}
int main()
{
cout << "one : " << solution_one(100) << endl;
cout << "two : " << solution_two(100) << endl;
cout << "two another : " << solution_two_another(100) << endl;
cout << "three : " << solution_three<100>::N << endl;
int sum = 0;
solution_four(100, sum);
cout << "four : " << sum << endl;
cout << "five : " << solution_five(100) << endl;
cout << "six : " << solution_six(100) << endl;
return 0;
}