日行一算(Consecutive Integer-连续整数)
题目
题目描述
2005年的百度之星初赛有这么一道题,一个正整数有可能可以被表示为 m(m>1) 个连续正整数之和,如:
15=1+2+3+4+5
15=4+5+6
15=7+8
但现在你的任务是判断给定的整数n能否表示成连续的m(m>1)个正整数之和。
解答要求
时间限制:1000ms, 内存限制:100MB
输入
输入只有一个整数n (1<n<230 +1)。
输出
若n能表示成连续的m(m>1)个正整数之和则输出“YES”,否则输出“NO”。
解题思路
分析:Java递归
- 初看这道题时,只觉得不需思考,循环就可以解决
思路:嵌套循环,逐项相加,当前n项和大于目标值,则减去左侧小的值使和小于目标值,再继续如此,直到等于目标值或循环结束。
最终在百万级别超时。 - 此时意识到双重循环耗时严重,需分析算法再进行求解
思路:连续数相当于等差数列,差为1,利用前n项和公式,使其等于目标值,根据项数不同,只要能求出首项为整数即可。
最终在十亿级别超时。 - 终于,这个数量级已经不是循环能搞定的了,必须在数学层面想点别的招了
思路:
奇数,一个奇数n可表示为(n+1)/2,(n-1)/2.所以奇数必然可以写成连续数。奇数的倍数是只需要在原有奇数序列两端不停的+1-1即可,直到左侧最小数变成0,此时为(n-n)/2,同时可以发现最大数为n,此时连续个数=奇数值,以后无论多少倍,在基础上加相应倍数即可。(例7:3,4 翻倍14:2,3,4,5 再翻28:0,1,2,3,4,5,6,7 此时除去0,个数与奇数值相同,无论在以后怎么加都ok)
那就简单了,目标数字能够除以2,最终是奇数即可(除了1),你想想是不是只有2的n次方不满足条件。
所以这道题的意义就是判断输入是否为2的n次方。
public class Main {
public static void main(String[] args) {
System.out.println(method(new Scanner(System.in).nextInt()));
}
private static String method(int num){
if(num == 1){
return "NO";
}
if(num %2 !=0 ){
return "YES";
}
return method(num/2);
}
}
日行一算(Consecutive Integer-连续整数)的更多相关文章
- 日行一算(Vowel-大小写转换)
题目 题目描述 solo从小就对英文字母非常感兴趣,尤其是元音字母(a,e,i,o,u,A,E,I,O,U),他在写日记的时候都会把元音字母写成大写的,辅音字母则都写成小写,虽然别人看起来很别扭,但是 ...
- 日行一算(Table-文字输出)
题目 +---+---+---+ | | | | +---+---+---+ | | | | +---+---+---+ | | | | +---+---+---+ 题目描述 上图是一个Mysql查询 ...
- 3月3日(5) Roman to Integer
原题 Roman to Integer 题意很简单,把Roman字母翻译成int. 实现方式也不难,针对每个字符转成int,从右往左,依次判断,如果当前值比上一个值大则相加,小则相减. 什么,你问我怎 ...
- android 股票数据通过日K获取周K的数据 算法 源码
目前的数据是从新浪接口获取的, http://biz.finance.sina.com.cn/stock/flash_hq/kline_data.php?symbol=sh600000&end ...
- Integer Numbers
ZOJ Problem Set - 3365 Integer Numbers Time Limit: 1 Second Memory Limit: 32768 KB Special ...
- ZOJ 3365 Integer Numbers
Integer Numbers Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on ZJU. Origina ...
- python学习笔记比较全
注:本笔记基于python2.6而编辑,尽量的偏向3.x的语法 Python的特色 1.简单 2.易学 3.免费.开源 4.高层语言: 封装内存管理等 5.可移植性: 程序如果避免使用依赖于系统的特性 ...
- Servlet 教程——检视阅读
Servlet 教程--检视阅读 参考 Servlet教程--菜鸟--蓝本 Servlet教程--w3cschool Servlet教程--易百 servlet依赖maven依赖: <!--se ...
- 学习SQLite之路(四)
20160621 更新 参考: http://www.runoob.com/sqlite/sqlite-tutorial.html 1. SQLite alter命令:不通过执行一个完整的转储和数 ...
随机推荐
- css画叉叉(一般用于关闭按钮)
css 一般用于右上角关闭弹窗 #pdclose { width: 18px; height: 18px; cursor: pointer; float: right; position: relat ...
- Python多环境管理神器(pyenv)
前面我们已经介绍了,python中两种最基础的虚拟环境管理工具,venv和virtualenv,其中virtualenv可以和virtualenvwrapper配合使用.详情请参考:https://w ...
- 校招面试之——Java容器
最近校招季,特把自己面试中遇到的问题整理整理,以巩固自己的知识. Java中对于容器有两大类存储方式,一种是单元素存放,还有一种就是key-value这种有关联的双元素存放了.对于Java中的容器,有 ...
- day6 斐波那契数列
1.求图片中的表达式: 2.求图中斐波那契数列的值
- Solon 开发,五、切面与环绕拦截
Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...
- k8s的应用包管理工具helm的部署和使用
1.概述 我们一般是在k8s里面部署一些简单的应用,比如用deployment,daemonset,statefuleset的方式来部署应用,但是如果要部署一些复杂的应用,那么整个配置的编写.部署的过 ...
- promise抛异常,执行队列
//promise抛出异常 new Promise((resolve,reject)=>{ resolve("成功") }).then(res=>{ if(res != ...
- mongo用户认证
mongo@rayos:/opt/mongodb$ mongo --port 28017 MongoDB shell version v4.0.13 connecting to: mongodb:// ...
- SIFT Learing records
目录 SIFT算法的步骤 小结 附录代码 花了一周的时间去读了一下SIFT的原论文,相关的一些视频还有文章,大体了解了其思想和步骤,在这里记录一下吧. SIFT是一种提取图像中具有尺度不变性的关键点的 ...
- git命令行-新建分支与已提交分支合并
例如要将A分支的一个commit合并到B分支: 首先切换到A分支 git checkout A git log 找出要合并的commit ID : 例如 325d41 然后切换到B分支上 git ch ...