禁止使用循环判断求1+2+3+..n

Posted octopus-22

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了禁止使用循环判断求1+2+3+..n相关的知识,希望对你有一定的参考价值。

题目描述

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
 
思路:
看到这一题的时候,不能使用乘除法和循环判断,当时就想到了使用二进制移位的方法,因为二进制不就只有加法操作,而且所有的计算在计算机里都是二进制操作。
 
首先:1+2+3+..+n  =   n(1+n)/2
 
其次需要了解一下二进制相关性质:
二进制数左移或右移N位等于扩大或缩小2的N次方倍
2进制的基数为2
所以
扩大10倍,相当于×2
缩小10倍,相当于÷2
扩大一倍,相当于x2的1次方
即左移或右移N位等于扩大或缩小2的N次方倍
 
现在把上面的求和公式变一下  =n2  + n  再根据上面的性质可得   n2次方幂+n  是1+2+3..+n的2的1次方倍,所以把结果想右移一位即可。
(PS:虽然可以通过,但发现我跑题了,Math.pow(n, 2)还不是用了好像判断,乘法,三元运算符都用上了,把这个思路写上来算是让自己多了解位运算吧)
 
 1 public class Solution {
 2     public int Sum_Solution(int n) {
 3         
 4         int res=(int)(Math.pow(n, 2)+n);
 5         
 6         res=res>>1;
 7         return res;
 8 
 9     }
10 }

 

也附上pow函数的算法,作为巩固

 

 1 public class Solution {
 2     public double Power(double base, int exponent) {
 3 
 4         double res = 1;
 5 
 6         int p = Math.abs(exponent);
 7 
 8         while (p != 0) {
 9 
10             if ((p & 1) != 0) {
11 
12                 res *= base;
13 
14             }
15             base *= base;
16             p >>= 1;
17         }
18 
19         return exponent < 0 ? 1 / res : res;
20 
21     }
22 }

 

下面这种方法是摘录过来的,运用了 逻辑运算符  &&,想法很好。

1.需利用逻辑与的短路特性实现递归终止。 2.当n==0时,(n>0)&&((sum+=Sum_Solution(n-1))>0)只执行前面的判断,为false,然后直接返回0
3.当n>0时,执行sum+=Sum_Solution(n-1),实现递归计算Sum_Solution(n)。
 
1 public int Sum_Solution(int n) {
2         int sum = n;
3         boolean ans = (n>0)&&((sum+=Sum_Solution(n-1))>0);
4         return sum;
5     }

 

给自己做个笔记:

1、逻辑运算的短路特性:
(表达式1)&&(表达式2) 如果表达式1为假,则表达式2不会进行运算,即表达式2“被短路”
(表达式1)||(表达式2) 如果表达式1为真,则表达式2不会进行运算,即表达式2“被短路”

 

2:逻辑运算和位运算(之前真没注意二者的细致区别,好像还混用了 &    &&)

 

位运算符

Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。

位运算符作用在所有的位上,并且按位运算。假设a = 60,b = 13;它们的二进制格式表示将如下:

技术分享图片

 

 逻辑运算符

下表列出了逻辑运算符的基本运算,假设布尔变量A为真,变量B为假

技术分享图片

 

 







以上是关于禁止使用循环判断求1+2+3+..n的主要内容,如果未能解决你的问题,请参考以下文章

无限循环计算阶乘问题

python求1+2+3+....+n的和

实现1+2+3...+n,要求不能使用乘除法循环条件判断选择相关的关键字

[算法]发散思维能力题目

求1+2+3+...+n

46求1+2+3+...+n,要求不能使用乘除法forwhileifelseswitchcase等关键字及条件判断语句(A?B:C)。