求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

8 篇文章 0 订阅

前几天在牛客网上面做了这道题,以前曾经看过这道题目的优化算法,但是限制的条件没有这么多,可能人们先想到这道题,都是会用for,while这样的循环来做,这样的做法就是最一般的做法。那次看这道题目时,那篇文章的作者是想告诉读者,如果可以采用公式的话,尽量采用公式,所以我理所当然的采用了高斯公式求解,我擦,在线提交竟然通过了,高斯公式的答案就是:sum=(1+n)*n/2,但是这样的做法使用了乘除,不符合题目的要求,但是竟然可以提交过去。我也是醉了。我给官方反应了这样的错误,官方给我的回复说没有发现任何问题,不知道他们的检查机制是什么样子的,废话不说了,下面推荐两种做法来解决这道题。


方法一:

首先在主函数中建立一个100个元素的对象数组,然后再构造函数中分别做id++,sum+=id。

#include<iostream>

using namespace std;

class Solution 
{
	public:
    	static int  id;
    	static int sum;
		Solution()
        {
			id++;
            sum+=id;
		}
    	int Sum_Solution()
        {
            return Solution::sum;
        }
};

int Solution::id=0;
int Solution::sum=0;
int main(void)
{
    Solution s[100];
    cout<<s[5].Sum_Solution()<<endl;
    return 0;
}


方法二:

相信这种方法是大多数人看到这道题目所想到的方法,递归。那么有一个问题就是没有了if这种判断语句,如何才能判断递归的终止条件呢?这时候就需要利用&&的短路特性,那么问题来了,什么是短路特性?所谓的短路特性就是A&&B,当A为真时,B需要做判断,而当A为假时,B不需要做判断。所以:


#include<iostream>

using namespace std;

//注意:这里的sum要么用引用类型,要么用指针类型,
//否则 每次递归都要在不同函数的栈上面 建立一个sum变量。 
int Add(int n,int& sum)

{
	n&&Add(n-1,sum); 
	return sum+=n; 
} 

int main(void)
{
	int sum=0,n=100;
	cout<<Add(n,sum)<<endl;
	return 0;
} 


运行环境:Win8.1+Dev-c++(5.6.1)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值