亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

2018-09-04

標簽:
Java

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

总结前面大牛们的方法,提供java的两种阶梯思路:

共同点:一,利用利用短路 && 来实现 if的功能;二,利用递归来实现循环while的功能

不同点:方法一:递归实现1+2+..+n;方法二:n(n+1)/2,递归实现n(n+1);方法三,利用Math实现n(n+1)

关于如何递归实现a*b,有大佬总结过,我搬下来:利用位运算来做,快速幂,快速模乘,

原理是把a拆成2的幂的和,a = 2^e0 + 2^e1 + 2^e2....
那么 a * b = (2^e0 + 2^e1 + 2^e2+...) * b

= b * 2^e0 + b * 2^e1 + b * 2^e2 + ...
= (b << e0) + (b << e1) + ....
接下来看代码:

方法一:递归实现1+2+..+n;

`public` `static` `int` `Sum_Solution(``int` `n) {``int` `sum = n;``boolean` `flag = (sum >` `0``) && ((sum += Sum_Solution(--n)) >` `0``);``return` `sum;``}`

方法三,利用Math实现n(n+1)

 public static int Sum_Solution1(int n) {        return (int) (Math.pow(n, 2) + n) >> 1;
    }

方法二:n(n+1)/2,递归实现n(n+1);

先参考使用while的例子,再转换

原理是把a拆成2的幂的和,a = 2^e0 + 2^e1 + 2^e2....

那么 a * b = (2^e0 + 2^e1 + 2^e2+...) * b

                  = b * 2^e0 + b * 2^e1 + b * 2^e2 + ...
                  = (b << e0) + (b << e1) + ....
`public` `static` `int` `Sum_Solution2(``int` `n) {``int` `res =` `0``;``int` `a = n;``//若a=2=10``int` `b = n +` `1``;``//b=3=11``while` `(a !=` `0``) {``if` `((a &` `1``) ==` `1``)``//a在第二位==1的时候才更新res=0+110=6``res += b;``a >>=` `1``;``//a右移1位 1``b <<=` `1``;``//b左移动1位 110``}``return` `res>>=``1``;``//n(n+1)/2     }`

接下来,用(a & 1) == 1和(a != 0)来代替判断语句

`public` `int` `Sum(``int` `n) {``int` `res = multi(n, n +` `1``);``//n*(n-1)``return` `res>>=``1``;``//n*(n-1)/2``}``private` `int` `multi(``int` `a,` `int` `b) {``int` `res =` `0``;``//循环体内部, if ((a & 1) == 1), res += b;``boolean` `flag1 = ((a &` `1``) ==` `1``) && (res += b) >` `0``;``a >>=` `1``;``b <<=` `1``;``// while (a != 0) {}循环条件``boolean` `flag2 = (a !=` `0``) && (res += multi(a,b)) >` `0` `;``return` `res;``}`

         




作者:芥末无疆sss
链接:https://www.jianshu.com/p/5914b321aaa7
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消