博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指Offer - 九度1354 - 和为S的连续正数序列
阅读量:5022 次
发布时间:2019-06-12

本文共 2141 字,大约阅读时间需要 7 分钟。

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的连续正数序列。每组数据末尾以“#”号结束。

样例输入:
45100-1
样例输出:
Pity!#2 3#9 10 11 12 13 14 15 1618 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)。
1 // 652789    zhuli19901106    1354    Accepted    点击此处查看所有case的执行结果    1032KB    787B    80MS 2 // 20131172038 3 #include 
4 #include
5 using namespace std; 6 7 int main() 8 { 9 int x, y;10 int tmp;11 int s;12 int res_count;13 int i;14 15 while(scanf("%d", &s) == 1 && s >= 0){16 if(s < 3){17 printf("Pity!\n#\n");18 continue;19 }20 21 s *= 2;22 x = (int)sqrt(s);23 res_count = 0;24 while(x >= 2){25 if(s % x == 0){26 y = s / x;27 if(y - x + 1 > 0 && ((y - x + 1) & 0x1) == 0){28 ++res_count;29 tmp = (y - x + 1) >> 1;30 printf("%d", tmp);31 for(i = tmp + 1; i < tmp + x; ++i){32 printf(" %d", i);33 }34 printf("\n");35 }36 }37 // watch out for the result order38 --x;39 }40 if(res_count <= 0){41 printf("Pity!\n");42 }43 printf("#\n");44 }45 46 return 0;47 }

 

转载于:https://www.cnblogs.com/zhuli19901106/p/3438566.html

你可能感兴趣的文章
Linux内核调试技术——jprobe使用与实现
查看>>
样式、格式布局
查看>>
ubuntu设计文件权限
查看>>
Vue双向绑定原理详解
查看>>
Android基础总结(5)——数据存储,持久化技术
查看>>
关于DataSet事务处理以及SqlDataAdapter四种用法
查看>>
bootstrap
查看>>
http://lorempixel.com/ 可以快速产生假图
查看>>
工程经验总结之吹水"管理大境界"
查看>>
为什么JS动态生成的input标签在后台有时候没法获取到
查看>>
20189210 移动开发平台第六周作业
查看>>
java之hibernate之基于外键的双向一对一关联映射
查看>>
rxjs一句话描述一个操作符(1)
查看>>
第一次独立上手多线程高并发的项目的心路历程
查看>>
ServiceStack 介绍
查看>>
Centos7下载和安装教程
查看>>
无谓的通宵加班之后的思索
查看>>
S1的小成果:MyKTV系统
查看>>
从setting文件导包
查看>>
编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成...
查看>>