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] 杜尚峰
- 【面试虐菜】—— JAVA面试题(1)
- JAVA增删改查XML文件
- javascript去掉字符串前后空格
- 构建通用的 React 和 Node 应用
- 有趣的 CSS 像素艺术
- 【插件开发】—— 11 窃听风云(Java事件监听原理-GEF实例讲解)
- 【面试虐菜】—— JAVA面试题(2)
- JavaMelody监控spring、struts
- 《JavaScript语言精粹》—— 读书总结
- 视差滚动技术的简介及运用
- 【面试虐菜】—— JAVA面试题(3)
- Carousel 旋转画廊特效的疑难杂症
- 区块链为IBM与Visa等老牌公司注入新的生机
- 【java.lang.UnsupportedClassVersionError】版本不一致出错
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 设计模式学习(六)-抽象工厂模式
- 彻底完美解决安卓苹果手机点击输入框网页页面自动放大缩小
- 第22天:NLP实战(六)——基于PaddleHub的疫情期间网民情绪识别
- Echarts大数据可视化物流航向省份流向迁徙动态图,开发全解+完美参数注释
- Linux 常用操作以及概念
- GCD梳理与总结——封装
- 原生JS在网页上复制的所有文字后面自动加上一段版权声明
- 使用宝塔docker安装为知笔记私有部署
- 第4天:美团点评2020校招测试方向笔试试卷分析
- Element-UI饿了么时间组件控件按月份周日期,开始时间结束时间范围限制参数
- 微信小程序flex布局
- 细数 TS 中那些奇怪的符号
- 安装RabbitMQ无法访问localhost:15672的管理界面解决
- koa中http服务与websocket服务共享端口
- 第23天:NLP实战(七)——中文新闻主题分类