思路1
这些关键字都不能用,那么只能用递归去模拟循环,逻辑表达式的短路原则去模拟判断了。
//用递归替代循环,用&&的短路来替代条件判断
public int sum(int n) {
int result = n;
/*
* 递归跳出条件,当n>0时,需要判断后续的条件所以会递到sum(n-1)!
* 当n=0时n>0为假,无需判断后序语句返回result,然后开始回溯!
*/
boolean b = (n>0)&&((result += sum(n-1))>0);
return result;
}
思路2
这是个等差数列求和,那么公式就是S=n(1+n)/2;
这个公式中的除2倒是好解决,用右移运算就行了;问题是如何实现这个乘法?
比较脑洞的解法是利用C语言中sizeof这个运算符了。开一个二维字符数组, 第一维大小为n,第二维大小为n + 1,这样用sizeof去计算这个字符数组的字节数的时候,就会自动执行n * (n + 1)了。
/*
* 等差数列求和,那么公式就是S=n(1+n)/2;
* 这个公式中的除2倒是好解决,用右移运算就行了;
*/
//使用c语言的sizeof运算符
public void sum2(int n) {
char[][] tmp = new char[n][n + 1];
//java语言不支持
//int result = sizeof(tmp)>>1;
}
思路3
同样可以用库函数pow了,n * (n + 1) = pow(n, 2) + n这样子就没有乘法了。
//用库函数pow了,n * (n + 1) = pow(n, 2) + n这样子就没有乘法了。
public int sum3(int n) {
//double类型的数字没有右移运算,所以强转成int
return (int)(Math.pow(n, 2) + n)>>1;
}
思路4
使用构造函数
//使用构造函数
private static int n = 0;
private static int sum = 0;
public static void Reset(){
n = 0;
sum = 0;
}
public SumOfOnetoN(){
++n;
sum += n;
}
public static int getSum(){
return sum;
}
public int sum4(int num) {
SumOfOnetoN.Reset();
SumOfOnetoN arr[] = new SumOfOnetoN[num];
for(int i=0;i<num;i++)
arr[i] = new SumOfOnetoN();
return SumOfOnetoN.getSum();
}
@Test
public void test1() {
System.out.println(sum4(10));
}