求1+2+…+n 要求不能使用 乘 除 法、for、while、if、else、switch、case等关键字以及条件判断语句

网上整理的几种方法 算是汇总 

#include <iostream>

using namespace std;
//要求不能使用 乘 除 法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
//题目:求1+2+…+n,
//****************方法1**********************//
//用构类的造函数来实现
/*
class sum
{
public:
    static int m ,m_sum;
     sum()
    {      m_sum +=  m;
           m++;
    }
};
int sum::m = 1;
int sum::m_sum = 0;
int main()
{
    int n;
    cin>>n;
    sum a[n];
    cout<<a[0].m_sum<<endl;
    return 0;
}
*/

//******************方法2**************//
//巧用递归和逻辑运算符  && 操作
/*
int sum(int n,int &m)
{
    n && sum(n - 1,m);
    return m += n;
}
int main()
{
    int n;
    int m = 0;
    cin>>n;
    cout<<sum(n,m)<<endl;
    return 0;
}
*/
//*****************方法3*************//
//利用模板元编程实现
//这种方法没有听说过 先MARK一下
/*
template <int N>
class C_Num
{
public:
	enum { m_Value = N + C_Num<N - 1>::m_Value};
};

template< >
class C_Num<1>
{
public:
	enum { m_Value = 1};
};
int main()
{
    const int m = 100;//必须为const否则报错 不知道为什么
    //cin>>m;
	cout << C_Num<m>::m_Value << endl;
	return 0;
}
*/

//******************方法4**************
//http://blog.csdn.net/yuucyf/article/details/6400601
//通过两个函数模拟递归调用的过程
/*--------------------------------
Copyright by yuucyf.	2011.05.06
---------------------------------*/
//typedef int (*PF_Fun) (int nValue);
//PF_Fun paFun[2];//函数指针
/*
int (*paFun[2])(int nValue) ;//把上面的两行 改为下面的一行 其实就是定义了一个函数指针 用上面的自定义类型更直观
//http://blog.csdn.net/qll125596718/article/details/6891881  typedef函数指针用法
int GetSum1(int nValue)
{
	return 0;
}

int GetSum2(int nValue)
{
	return (*paFun[!!nValue])(nValue - 1) + nValue;
}

int GetValue2(int nValue)
{
	paFun[0] = GetSum1;
	paFun[1] = GetSum2;

	int nSum = GetSum2(nValue);
	return nSum;
}

int main()
{
    int n ;
    cin>>n;
	cout << GetValue2(n) << endl;

	return 0;
}
*/
//************方法5************//
//虚函数的特性来处理这样的问题
//MAKR
/*---------------------------
Copyright by july. 2010/10/19
Modified by yuucyf.2011.05.06
----------------------------*/
class C_Num;
C_Num* paNum[2];

class C_Num
{
public:

	virtual int GetSum (int nValue) { return 0; }
};

class C_NumEx: public C_Num
{
public:
	virtual int GetSum(int nValue) { return paNum[!!nValue]->GetSum(nValue-1) + nValue; }
};

int GetValue2(int nVal)
{
	C_Num objNum;
	C_NumEx objNumEx;
	paNum[0] = &objNum;
	paNum[1] = &objNumEx;

	//利用虚函数的特性,当paNum[1]为0时,即paNum[0] = &objNum; 执行C_Num::GetSum,
	//当Array[1]不为0时, 即paNum[1] = &objNumEx; 执行C_NumEx::GetSum。
	int nSum = paNum[1]->GetSum(nVal);


	return nSum;
}

int main()
{
    int n;
    cin>>n;
	cout << GetValue2(n) << endl;

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值