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

本文探讨了一种不使用常规控制流和算术运算的求和方法,通过位运算和逻辑短路特性实现了1到n的累加。介绍了位运算的基础,包括左移和右移操作,以及如何利用这些操作来避免使用乘除法和循环。同时,文章展示了如何利用逻辑运算符&&的短路特性实现递归终止,提供了一种新颖的求和算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

求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次方倍
 
现在把上面的求和公式变一下  =n²  + 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为假

 

 

转载于:https://www.cnblogs.com/Octopus-22/p/9461533.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值