Day47:求1+2+3+……+n

时间:2022-07-24
本文章向大家介绍Day47:求1+2+3+……+n,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

剑指Offer_编程题——求1+2+3+……+n

题目描述:

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

具体要求:

时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M

具体实现

思路一:   众所周知,我们学的等差数列求和:1+2+3+……+n=(1 + n)*n/2=(n+n^2)/2,这里我们可以用到一个math库中的pow()函数。另外题目要求不能用乘、除法,因此我们可以用位移中的右移来代替除法.在实现这一算法之前,我们首先给大家介绍计算机中的位移。在计算机中,位移分为左移和右移。左位移用符号 <<,有位移用符号>>。这里需要我们了解其在数学中的真实的含义:在数学没有溢出的前提下,对于正数和负数,左移以为都相当于乘以2的1次方,左移n位。就相当于乘以2的n次方。右移一位相当于除以2,右移n位相当于除以2的n次方,这里取的是商,不要余数。我们通过案例来说明该情况:例如:3<<2则是将数字3左移动2位,计算过程为:3<<2首先把3转换为二进制数字00000000000000000000000000000011;然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的连个空位补零。则得到的结果是00000000000000000000000000001100,则转换为十进制是12。对于右位移来说:例如:11>>2则是将数字11右移2位。计算过程:11的二进制形式为:00000000000000000000000000001011然后把低位的最,后两个数字移出,因为该数字是正数,所以在高位补0,则得到的最终的二进制结果为:00000000000000000000000000000010转换为十进制数为3。具体我们用java和python实现。 1、我们首先用java将其实现:

public class Solution{
	public int Sum_Solution(int n){
		int sum = (int)(Math.pow(n,2) + n);
		return sum >> 1;
	}
}

代码效果图如图所示:

2、我们用python将其实现:

import math
class Solution:
	def Sum_Solution(self, n):
		sum = (int)(math.pow(n, 2) + n)
		return sum>>1

代码效果图如图所示:

思路二:   这道题明确不能用循环、判断以及乘除运算,因此我们只能用递归和逻辑运算。接下来我们用java和python实现这一思路: 1、接下来我们用java实现该思路:

public class Solution{
	public int Sum_Solution(int n){
		int res = n;
		boolean flag = (n > 0)&&((res += Sum_Solution(n - 1)) > 0);
		return res;
	}
}

代码效果图如图所示:

2、接下来我们用python将其实现:

class Solution:
	def Sum_Solution(self, n):
		def s(n):
			b = (n > 0) and ((n + s(n - 1)))
			return b
		return s(n)

代码效果图如图所示:

总结

  本道题主要通过数学中的等差数列作为背景考察我们对右移以及pow()方法的简单使用。本题用两种方法将其实现,并且我们分别使用java和python将其实现。首先我们用到的是最为简单的公式法,题目要求又不能用乘除,因此我们用pow()方法代替乘法,用右移代替除法。因此,我们在做题的时候,应该多次尝试各种方法,扩展自己的思维,写出优质的代码。总之,我们要继续加油,争取早日找到工作,Good Luck!!!

参考文献

[1] python中的左位移和右位移 [2] Don’t_Touch_Me [3] 杜尚峰