发散思维题——求1+2+3+...+n(剑指offer)

求1+2+3+...+n
  • 参与人数:1364时间限制:1秒空间限制:32768K
  • 通过比例:27.43%
  • 最佳记录:0 ms|0K()

题目描述

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

链接:http://www.nowcoder.com/practice/7a0da8fc483247ff8800059e12d7caf1?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路:由于不能用一些运算和关键字,所以就要我们开动下大脑了。首先我想到的递归,一般的递归最后有个判断的结束符if(n==1) return 1;之类的,但是这里不能用if 那可以用什么代替吗? 有的!n本身就带有运算就可以了,想到逻辑运算符&& 可以解决问题! 但是递归的效率本身就不是很高,尤其是n很大的时候;

那么还有什么其他的方法吗?  有的!我想到的利用构造函数,和静态变量;每次让它做加法,调用n次就可以了,这样的效率明显要比递归来的快 !

/****
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
*/
#include<cstdio>
#include<iostream>
using namespace std;
static int N;
static int Sum;
/*
class FunSum {
public:
    FunSum(){++N;Sum+=N;}
};
class Solution {
public:
    int Sum_Solution(int n) {
        N=0;
        Sum=0;
        FunSum *a = new FunSum[n];
        delete []a;
        a=NULL;//不能让a变成野指针
        return Sum;

    }
};*/
class Solution {
public:
    int Sum_Solution(int n) {
        int sum = n;
        sum && (sum += Sum_Solution(n-1));
        return sum;
    }
};
int main()
{
    int n;
    Solution so;
    while(scanf("%d",&n)!=EOF)
    {
        printf("%d\n",so.Sum_Solution(n));
    }
    return 0;
}

当然还有其他更好的方法,大家多多发散下思维!


你可能感兴趣的:(剑指offer,发散思维题,求1+2+3+...+n)