本题为剑指offer面试题46
牛客网测试地址:https://www.nowcoder.com/questionTerminal/7a0da8fc483247ff8800059e12d7caf1
- 时间限制:1秒空间限制:32768K
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
Java代码:
package go.jacob.day518;
/*
* [编程题]求1+2+3+...+n
*
* 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、
* switch、case等关键字及条件判断语句(A?B:C)。
*/
public class Demo1 {
/*
* 这是借鉴剑指offer上的解法一:利用构造函数求解 很遗憾,这种方法只能在c++上实现 因为Demo1[] demo1s=new
* Demo1[n];并不会调用构造函数 所以这是一种错误解法!!!!!!
*/
public static int Sum_Solution(int n) {
Demo1.reset();
Demo1[] demo1s = new Demo1[n];
return Demo1.getSum();
}
private static int N;
private static int sum;
/*
* 构造函数
*/
public Demo1() {
N++;
sum += N;
}
/*
* N与sum都是静态成员变量,所以每一次调用必须进行重置
*/
public static void reset() {
N = 0;
sum = 0;
}
/*
* 获得sum
*/
public static int getSum() {
return sum;
}
}
/*
* 方法二:利用短路性质
*
* 如果n=0,直接返回0;如果n>0,计算result+= Sum_Solution(n - 1))
*/
class Demo2 {
/*
* value没有用处,只是为了boolean value=(n>0)&&((result+=Sum_Solution(n-1))==0)能运行
*/
public int Sum_Solution(int n) {
int result = n;
boolean value = (n > 0) && ((result += Sum_Solution(n - 1)) == 0);
return result;
}
}
/*
* 方法三,变相利用公式sum=n(n+1)/2
* 有可能会不符合题意
*/
class Demo3{
public int Sum_Solution(int n) {
int sum=0;
sum=(int) (Math.pow((double)n, 2)+n)>>1;
return sum;
}
}