求1+2+3+…+n
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
解题思路
因为无法使用乘除法,所以n(1+n)/2就不能使用,不能使用for和while,所以循环无法使用
- 利用逻辑与的短路实现递归终止
- 当n==0,(sum>0)&&((sum+=Sum_Solution(–n))>0)只执行前面的判断,为false,直接返回0;
- 当n>0,执行sum+=Sum_Solution(–n),实现递归计算Sum_Solution(int n)
代码
/**
* 剑指offer一刷:1+2+3+...+n
*
* @author User
* @create 2019-06-02-14:58
*/
public class jzo47 {
public int Sum_Solution(int n) {
int sum=n;
boolean flag=(sum>0)&&((sum+=Sum_Solution(--n))>0);
return sum;
}
public static void main(String[] args){
int n=100;
jzo47 so=new jzo47();
System.out.println(so.Sum_Solution(n));
}
}
不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
解题思路
四则运算不能使用,需要将加法转化为位运算。
- 各位相加不计进位
- 记下进位
- 前两步相加
代码
/**
* 剑指offer一刷:不用加减乘除做加法
*
* @author User
* @create 2019-06-02-15:16
*/
public class jzo48 {
public int Add(int num1,int num2) {
int sum,index;
do {
sum=num1^num2;
index=(num1&num2)<<1;
num1=sum;
num2=index;
}while (num2!=0);
return num1;
}
public static void main(String[] args){
int num1=5,num2=7;
jzo48 so=new jzo48();
System.out.println(so.Add(num1,num2));
}
}