剑指Offer - 九度1354 - 和为S的连续正数序列
2013-11-23 02:02
题目描述:

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

输入:

输入有多组数据。

每组数据仅包括1个整数S(S<=1,000,000)。如果S为负数时,则结束输入。

输出:

对应每组数据,若不存在和为S的连续正数序列,则输出“Pity!”;否则,按照开始数字从小到大的顺序,输出所有和为S的连续正数序列。每组数据末尾以“#”号结束。

样例输入:
4
5
100
-1
样例输出:
Pity!
#
2 3
#
9 10 11 12 13 14 15 16
18 19 20 21 22
#
题意分析:
  题目要求求出对于一个数S,有多少种不同的连续正数序列加起来等于这个数S,数列至少要两个数。
  比如
    12 = 3 + 4 + 5
    13 = 6 + 7
  对于n个数a, a + 1, a + 2, ..., a + n - 1,加起来和sum = (a + a + n - 1) * n / 2;
  所以对于某些n,我们要求2 * S = (2 * a + n - 1) * n的整数解。
  因为题目要求所有数都是正整数,所以a >= 1,2 * a + n - 1 >= n + 1 > n,于是n < sqrt(2 * S),确定了范围限制在sqrt(1000000)内,也就是1000。,程序效率不成问题
  对于2至[sqrt(2 * S)]的整数n,对应判断每一个能否求出整数解即可。有整数解的话,输出对应的连续数列。
  注意题目要求按照开始数字从小到大输出结果。开头数字越小,项数也就越多,n也就越大,所以n要从sqrt(2 * S)往下递减。
  时间复杂度O(sqrt(S)),空间复杂度O(1)。
 // 652789    zhuli19901106    1354    Accepted    点击此处查看所有case的执行结果    1032KB    787B    80MS
//
#include <cmath>
#include <cstdio>
using namespace std; int main()
{
int x, y;
int tmp;
int s;
int res_count;
int i; while(scanf("%d", &s) == && s >= ){
if(s < ){
printf("Pity!\n#\n");
continue;
} s *= ;
x = (int)sqrt(s);
res_count = ;
while(x >= ){
if(s % x == ){
y = s / x;
if(y - x + > && ((y - x + ) & 0x1) == ){
++res_count;
tmp = (y - x + ) >> ;
printf("%d", tmp);
for(i = tmp + ; i < tmp + x; ++i){
printf(" %d", i);
}
printf("\n");
}
}
// watch out for the result order
--x;
}
if(res_count <= ){
printf("Pity!\n");
}
printf("#\n");
} return ;
}

剑指Offer - 九度1354 - 和为S的连续正数序列的更多相关文章

  1. 剑指Offer - 九度1372 - 最大子向量和(连续子数组的最大和)

    剑指Offer - 九度1372 - 最大子向量和(连续子数组的最大和)2013-11-23 16:25 题目描述: HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天JOBDU测试组开完会后, ...

  2. 剑指offer(41)和为S的连续正数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  3. 【剑指Offer】41、和为S的连续正数序列

      题目描述:   小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数). ...

  4. 剑指Offer - 九度1524 - 复杂链表的复制

    剑指Offer - 九度1524 - 复杂链表的复制2014-02-07 01:30 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点 ...

  5. 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先

    剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...

  6. 剑指Offer - 九度1508 - 把字符串转换成整数

    剑指Offer - 九度1508 - 把字符串转换成整数2014-02-06 23:46 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例 ...

  7. 剑指Offer - 九度1504 - 把数组排成最小的数

    剑指Offer - 九度1504 - 把数组排成最小的数2014-02-06 00:19 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输 ...

  8. 剑指Offer - 九度1503 - 二叉搜索树与双向链表

    剑指Offer - 九度1503 - 二叉搜索树与双向链表2014-02-05 23:39 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树 ...

  9. 剑指Offer - 九度1390 - 矩形覆盖

    剑指Offer - 九度1390 - 矩形覆盖2014-02-05 23:27 题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形 ...

随机推荐

  1. java设置随机数教程

    java作为程序猿开发人员都在使用的一款编程语言,许多入门的朋友都陷入了一个简单的问题就是,使用java开发时随机数要怎么设置?java怎么设置随机数?经常会有地方需要用到随机数,不用着急,一起来看看 ...

  2. Windows Host 文件

    Windows XP Home / Windows 7/ Windows Server 2008 c:\windows\system32\drivers\etc\hosts 如果碰到Localhost ...

  3. April 18 2017 Week 16 Tuesday

    Every light has darkness to balance it out. 有光明的地方,必定有黑暗予以平衡. I strive to get a balance between life ...

  4. 阿里云主机ss

    https://promotion.aliyun.com/ntms/act/vm/aliyun-group/buy.html?group=HdcwGIaf6i

  5. javascript原生API总结

    一.查找: getElementById() 方法返回带有指定 ID 的元素(唯一): getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组). ...

  6. background和background-image一点小区别

    如果使用background-image属性,则no-repeat不能使用,因为其对background-image不起作用. 可以使用background属性,再设置no-repeat.

  7. JS isArray、typeof、instanceof

    Array.isArray() 用来检验是不是数组 var a = [1,2,3] console.log(typeof a); // object console.log(Array.isArray ...

  8. Eclipse Git 插件 基本操作一【learn】

    安装GIT插件: 我的Eclipse版本为: Oxygen.2 Release (4.7.2),所以自带GIT插件,跳过安装. GIT插件配置: ①.添加好用户名和邮箱 注意下输入格式:user.na ...

  9. JT796、JT1077部标平台检测报名须知

    检测报名须知 申请道路运输车辆卫星定位系统平台标准符合性检测时,请先将1检测意向单(只针对企业监控平台).2符合性检测申请材料(基本材料包括:申请函.授权人身份证复印件.检测登记表.运输企业信息表.平 ...

  10. C编程经验总结4

    {}体里的语句不管在一行还是在多行,之间都是要有: for与for之间可以是独立的,也可以是相互嵌套的 For( ; i<5; )=for( ;i<=4;  ) 一般都是在循环里面进行判断 ...