题目:求1+2+……+n,要求不能使用整除法,for,while,if,else,switch,case等循环关键字及条件判断语句(A?B:C)

和几个朋友讨论这个问题,差不多有如下解法:

1.枚举+模板类方法:

#include<iostream>
using namespace std;

template<int N>
class add{
	public:
		enum{
			value = add<N-1>::value+N
		};
};

template<>
class add<1>{
	public:
		enum{
			value=1
		};
};

int main(){
	cout<<add<100>::value<<endl;
	return 0;
}
这个方法的使用在于使用枚举构造参数value,规定了一种参数的形式为value+n,n为模板类的构造参数,当我们构造这个模板类add的时候,自动value进行运算,每一次运算还会自动调用【递归】一次模板类add,然后我们再人为的规定一个模板类的特殊值,也就是当add=1的时候,value的值就为1,不再向下递减。

2.构造函数方法:

#include<iostream>
using namespace std;

class add{
	public:
		add(){
			n++;
			sum+=n;
		}
		static int n;
		static int sum;
};

int add::n=0;
int add::sum=0;

int main(){
	int nnnnn=100;
	add *p = new add[nnnnn];
	cout<<add::sum<<endl;
	delete[] p;
	p=NULL; 
	return 0;
}

构造的方法:注意记得销毁,别当野指针

创建两个静态的变量n和sum在一个类里面,这个两个参数设置默认值为0,然后创建nnnnn个对象(就是题目要求的上界值),每次一创建就会对这两个静态的成员变量进行一次递增的操作和一个求和的操作,当我们创建了nnnnn个对象之后,求得得sum值也就是我们题目得要求值。

3.最简单的短路方法

#include<iostream>
using namespace std;

int fun(int n){
	int ans=n;
	ans && (ans+=fun(n-1));
	return ans;	
}

int main(){
	cout<<fun(100)<<endl;
	return 0;
}

这个是最简单得做法,利用C/C++语言,判断语句的短路特性,也就是&&与判断中,左边一旦为假值,右边便不再进行运算(直接忽略),利用这个方法巧妙的替代if的使用,再配合上函数递归即可完成。

另一个短路的表示法,其实没什么区别,利用!ans取反与 || 或判断,当ans为正数的时候只考虑或的后半段,【跳过】前半段,当ans为0的时候就跳过后半段,直接输出。

#include<iostream>
using namespace std;

int fun(int n){
	int ans=n;
	!ans || (ans+=fun(n-1));
	return ans;	
}

int main(){
	cout<<fun(100)<<endl;
	return 0;
}

4.等差数列公式+二进制处理

这方法没有什么实际的意义,在高中数学我们学习过,等差数列的和等于((首项+末项)*项数)/2,的公式,然而题目禁止使用整除,导致不能直接除以2,但是我们可以利用计算机的原理解决

计算机始终以二进制计算,当二进制数整体右移一位的时候,可以理解为数据整体除以2,于是就构造出了最简单的方法。

#include<iostream>
using namespace std;

int main(){
	int n=100;
	int ans = ((1+n)*n)>>1;
	cout<<ans<<endl;
	return 0;
}

和朋友一起讨论的题目记录,会持续更新。

分类: CC++编程语言

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注