博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
将一个正整数表示为连续自然数的和
阅读量:6685 次
发布时间:2019-06-25

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

原文:

  将一个正整数表示为连续自然数的和,比如给定整数15,那么根据题意,需要输出的连续自然数为1+2+3+4+5=4+5+6=7+8=15。题目中的连续自然数序列可以看做一个升序的有序数组,取数组前两个数为起始的区间的左右两个端点。对区间中的值进行累加,如果累加值小于给定的整数时,那么右端点向右移动,添加下一个数字,如果累加值大于给定的整数时,那么左端点向右移动,表示去掉最左端的最小值,如果值与给定整数相等,那么输出后,需要重新对定区间左右两个端点赋值,直到左端点的值小于 (number+1)/2。代码如下:

1 void printContinuous(int begin, int end, int value) 2 { 3     for(int i=begin; i!=end; i++) 4         cout<<<"+"; 5     cout<
<<" = "<
<
= n,所以控制begin
n)//如果sum>n,那么begin右移,即减去最左边的数25 {26 sum-=begin;27 begin++;28 }29 else//如果sum

  上面的解法可以满足题目的要求,我们现在试着用数学的方法来求解此题。题目中要求将给定整数表示为连续自然数的和,而连续自然数序列可以看做一个等差数列,那么题目可以重新描述为,求出和为给定整数值的自然数组成的等差数列。等差数列前n项和的公式为:a1*n+ n*(n-1)*d/2,其中a1表示首项值,n表示项数,d表示公差。根据公式,可以写出代码:

1 void findContinuous2(int n) 2 { 3     for(int i=1; i<(n+1)/2; i++) 4     { 5         for(int j=1; j<(n+1)/2; j++) 6         { 7             //表示以i开头,到i后面j项为止的等差数列和 8             int sum = i*j+(j*(j-1)/2); 9             if(sum == n)10             {11                 printContinuous(i, i+j-1, n);12             }13         }14     }15 }

  可以看出,数学对于一些算法还是比较重要的,不能说一定会提高程序的运行效率,但在解决一些问题是,数学上的知识会帮助我们更加清晰化的解法。

转载地址:http://auhao.baihongyu.com/

你可能感兴趣的文章
kali linux2.0安装vega
查看>>
我的第一个python web开发框架(6)——第一个Hello World
查看>>
Windows下swoole扩展的编译安装部署
查看>>
你只是假装很努力
查看>>
ipc 进程间通讯的AIDL
查看>>
C语言版——点亮LED灯,深入到栈
查看>>
安装setuptools和pip
查看>>
C#使用BeginInvoke和EndInvoke异步下载和获取返回结果
查看>>
MII_GMII_RGMII_RMII_SMII_SSMII_TBI_RTBI
查看>>
ceph-RGW Jewel版新概念
查看>>
001-对象——基础知识
查看>>
Redis 高可用集群
查看>>
jQuery图片tab栏切换
查看>>
2.C#知识点:I/O
查看>>
ios 集成react native
查看>>
两个自定义对象List列表取交集(intersection)
查看>>
使用git克隆指定分支的代码
查看>>
gradle 项目构建以及发布maven 私服&& docker 私服构建发布
查看>>
struts2与spring集成时,关于class属性及成员bean自动注入的问题
查看>>
django数据库操作-增删改查-多对多关系以及一对多(外键)关系
查看>>