前段时间在CSDN上溜达的时候发现有人发帖问一道算法题的解法,看到之后感觉很有意思。题目如下
题目描述:一个正整数有可能可以被表示为 n(n>=2) 个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 15=7+8 请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
看到这道题后很容易想到第一中解法,就是2层循环的解法。不过感觉该算法的效率太低,我看到这个题目就立即想起了求和公式,我知道肯定有效率高的解法,刚好也没事就想着做做看。经过了一段时间的推导,我终于把程序完成了。程序代码如下,使用C++写得。
int main(void) {
int n;
cout<<"please input a num: n=";
cin>>n;
if(n%2)
cout<<n/2<<" "<<n/2+1<<endl;
for(int i=3;i<n;++i){
if(!(2*n%i)&&(i*i+i>2*n)){
int temp=i-(i+2*n/i-1)/2;
for(int j=0;j<2*n/i;++j)
cout<<temp+j<<" ";
cout<<endl;
}
}
}
程序大概就是这个样子,感觉这样写出来的程序效率就比常规的解法要高很多,达到了O(n)级别。整个程序的主要思路就是围绕着求和公式进行的,只要稍微推导下就能明白程序的意思了。
若一个数k满足题目的要求,比如可以分解成k=m+(m+1)+....+n,那么按照求和公式可以得到等式:
(m+n)*(n-m+1)/2=k ------> 2*k=(m+n)*(n-m+1); -----> 2*k一定可以分解成2个整数相乘,即可以被2个整数整除。设m+n=i ------> n-m+1=2*k/i ------> m=i-i+(2*k/i-1)/2 根据题目要求 m>0 就可以得出约束条件,这样再看程序就一目了然。
后来我又从百度之星上发现了这道题,才知道原来是2005的第一题。
分享到:
相关推荐
2006年百度之星程序设计大赛复赛第4题 彩球游戏(zuma) 解法
一道 Google 竞赛题的解法
对一道高考试题解法的探究中国多媒体教学学报中学数学.docx
2016 年 杭电 笔试 第二题 Ruby解法
新数通 HCIE3.0 LAB完整版【拓扑+TS+TAC+解法】解法题库新增论述题HCIE笔试题库,同时赠送ENSP软件,用于2022年6月底HCIE数通笔试及LAB实验考试。 1、HCIE数通笔试背过里面题库去考全部通过 2、HCIE LAB拓扑及解法,...
一道力学题的四种解法.docx
微分方程数值解法 一书中主要习题解答 及其习题拓展,纯手工录入,公式清晰,步骤清晰
语言连贯题解法秘籍.ppt
历年全国数学建模试题及解法归纳及06~08年全国赛题评阅要点
一元二次方程练习题解法.doc
信息系统项目管理师运筹学历年真题解法汇总笔记,整理了历年的真题和讲解,有需要的请下载。
高三数学选择题解法PPT课件.pptx
高三数学填空题解法PPT课件.pptx
中小学数学奥赛题解法分析.pdf
2016年高考数学选择题解法选讲
偏微分方程数值解法常见习题,麻烦各位朋友帮忙解答。
信息系统项目管理师运筹学历年真题解法汇总笔记
初中《道德与法治》选择题解法指导.ppt
应用光学中关于图解法很多同学学起来有困难,这个课件是图解法的习题课课件