博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【编程题目】和为 n 连续正数序列
阅读量:6626 次
发布时间:2019-06-25

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

51.和为 n 连续正数序列(数组)。

题目:输入一个正数 n,输出所有和为 n 连续正数序列。
例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以输出 3 个连续序列 1-5、 4- 6 和 7-8。
分析:这是网易的一道面试题。

 

一道简单的小题

/*51.和为 n 连续正数序列(数组)。题目:输入一个正数 n,输出所有和为 n 连续正数序列。例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以输出 3 个连续序列 1-5、 4- 6 和 7-8。分析:这是网易的一道面试题。*/#include 
//思路:设连续数字中首个数字为 s 连续数字个数为 l//则这些数字的和为 s*l + l*(l-1)/2void find(int n){ int l; int s; for(s = 1; s * 2 + 1 <= n; s++) //首个数字循环 { for(l = 1; s * l + (l *(l - 1))/2 <= n; l++) { if(s * l + (l *(l - 1))/2 == n) { for(int i = s; i < l + s; i++) { printf("%d ", i); } printf("\n"); } } }}int main(){ find(30000154); return 0;}

 

网上看到一个思路更好的, 其实没有必要对s循环的,根据l直接算s就可以了。

http://blog.csdn.net/wumuzi520/article/details/8046201

那么

       a1+a2+...+ak=n

因为连续,所以

       a1+(a1+1)+(a1+2)+...+(a1+k-1)=n

      k*a1+k(k-1)/2=n

这样就可以求得

      a1=(n-k(k-1)/2)/k

a1即为连续数中的最小值,只有在a1为整数的情况下才会符合要求,即

      (n-k(k-1)/2)%k==0

时才符合要求。

对符合要求的a1连续打印k个递增(公差为1)的值即可。

#include 
#include
using namespace std;void Sequence1(int n){ int M = (sqrt(8*n+1)-1)/2; for(int i = 2; i <= M; i++) { if((n-(i-1)*i/2)%i == 0) //!!!!!注意学习这里 { int nMin = (n-(i-1)*i/2)/i; for(int j = 0; j < i; j++) { cout << nMin++ << " "; } cout << endl; } }}

 

你可能感兴趣的文章
对.NET跨平台的随想
查看>>
ng-view 路由 简单应用
查看>>
Nginx Rewrite规则初探(转)
查看>>
Spring学习笔记1——IOC: 尽量使用注解以及java代码(转)
查看>>
黑魔法NSURLProtocol 可拦截网络加载
查看>>
Webtop中新建文档,无法选择Type和Format
查看>>
Integration Services创建ETL包
查看>>
IE浏览器开发中遇到的问题
查看>>
【C#学习笔记】载入图片并居中
查看>>
php实现按utf8编码对字符串进行分割
查看>>
Ftp的断点下载实现
查看>>
[转载] ubuntu Authentication failure
查看>>
Ring0 - 链表
查看>>
修改数组之----splice
查看>>
a版本冲刺第五天
查看>>
Arduino示例教程超声波测距实验
查看>>
Redis操作hash
查看>>
轻松搞定个人虚拟桌面部署之5-在客户端测试远程桌面
查看>>
Linux中chkconfig使用介绍
查看>>
二进制方式快速安装MySQL数据库
查看>>