/************
  http://www.anycodes.cn/zh/
  by wz 5/1/2016
交换两个数值
1+2=3
1+2+3+...++N
http://blog.csdn.net/liuqiyao_01/article/details/39292999/
Atoi();
************/
#include <stdio.h>
#define L	sum+=(++n);
#define K	L;L;L;L;L;L;L;L;L;L;
#define J	K;K;K;K;K;K;K;K;K;K;
#define H	J;J;J;J;J;J;J;J;J;J;
//for SumN1

 
#include <iostream>
using namespace std;
void myswap(int x,int y)
{  cout<<"myswap:"<<endl<<"\t\t x="<<x<<",y="<<y;
	x^=y^=x^=y;
	cout<<"then,x="<<x<<",y="<<y<<endl;
}
void myadd(int x,int y)
{
	  cout<<"myadd:"<<endl<<"\t\t"<<"x="<<x<<",y="<<y;
	int sum,carry;
	do 
	{
	sum=x^y;
	carry=(x&y)<<1;
	x=sum;
	y=carry;	
	} while (y!=0);//y
   //cout<<x;       //x return
   cout<<",x+y="<<x<<endl;
   
}
//约瑟夫环是一个映射序列问题
//总结规律后的代码简约

void ysf_last_one(unsigned int n,unsigned int m)
{   int last = 0;
	//if(n<1 || m<1) return -1;	
	for(int i=2;i<=n;i++) 
	      last=(last+m)%i;  
	//return last;
	cout<<"ysf_last_one:"<<endl<<"\t\t"<<"约瑟夫环问题,"<<n<<"个人,"<<"数"<<m<<"的人出环,最后剩下的是第"<<last+1<<"个人"<<endl;
}
void SumN1()
{
	int sum = 0;
	int n = 0;
	H;
	printf("%d\n", sum);
}
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_Solution1(unsigned int n)
{
	Temp::Reset();

	Temp *a = new Temp[n];
	delete []a;
	a = NULL;
	return Temp::GetSum();
}
void sumN2()
{
	printf("%d\n", Sum_Solution1(1000));
} 
using namespace std;

class A;
A* Array[2];

class A
{
public:
	virtual unsigned int Sum(unsigned int n)
	{
		return 0;
	}
};
class B:public A
{
public:
	virtual unsigned int Sum(unsigned int n)
	{
		return Array[!!n]->Sum(n-1) + n;
	}
};

int Sum_Solutiion2(int n)
{
	A a;
	B b;
	Array[0] = &a;
	Array[1] = &b;
	int value = Array[1]->Sum(n);
	return value;
}
void SumN3()
{
	printf("%d\n", Sum_Solutiion2(1000));
} 
typedef unsigned int (*fun)(unsigned int);

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

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

 void SumN4()
{
	printf("%d\n", Sum_Solutiion3(1000));
} 
/*
template <unsigned int n>struct Sum_Solutiion4
{
	enum Value{N = Sum_Solutiion4<N-1>::N + n};
};

template <> struct Sum_Solutiion4<1>
{
	enum Value{N = 1};
};

void SumN5()
{
	printf("%d\n", Sum_Solutiion4<1000>::N);
}

*/
int main(int argc, char *argv[])
{
	printf("\tHello, world\n");
   	      myswap(0,1);
 	       myadd(1,2);
    ysf_last_one(5,3);
     cout<<"接下来 5种方法求 1到N的和,模板的待修改"<<endl;
    SumN4();
    SumN3();
    sumN2();
    SumN1();
	return 0;
}