将一个正整数表示为连续自然数的和

原文:将一个正整数表示为连续自然数的和

  将一个正整数表示为连续自然数的和,比如给定整数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<<i<<"+";
 5     cout<<end<<" = "<<value<<endl;
 6 }
 7
 8 void findContinuous(int n)
 9 {
10     int begin=1, end = 2;   //begin和end分别代表和为n的连续正数的区间
11     int middle = (n+1)/2;   //middle表示n的中间数,middle*2 >= n,所以控制begin<middle即可
12     int sum = begin+end;
13
14     while(begin < middle)
15     {
16         if(sum == n)    //和与n相等,则打印
17         {
18             printContinuous(begin, end, n);
19             //从begin+1开始重新计算sum的值
20             begin++;
21             end = begin+1;
22             sum = begin+end;
23         }
24         else if(sum > n)//如果sum>n,那么begin右移,即减去最左边的数
25         {
26             sum-=begin;
27             begin++;
28         }
29         else//如果sum<n,那么end右移,即添加一个数
30         {
31             end++;
32             sum+=end;
33         }
34     }
35 }

  上面的解法可以满足题目的要求,我们现在试着用数学的方法来求解此题。题目中要求将给定整数表示为连续自然数的和,而连续自然数序列可以看做一个等差数列,那么题目可以重新描述为,求出和为给定整数值的自然数组成的等差数列。等差数列前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 }

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

时间: 2025-01-25 13:55:30

将一个正整数表示为连续自然数的和的相关文章

将一个正整数分解质因数

查看全套"c语言习题集" 题目: 将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可. (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步. (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步. 2.程序源代码: #include "

Java实现将一个正整数分解质因数

* 题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. * 分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: *(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可. *(2)如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步. *(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步. *这个题目很明显是要用递归算法来实现的,打印"*"有些技巧,但也很容易解

正整数分解为几个连续自然数之和

题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列. 一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 15=7+8 有些数可以写成连续N(>1)个自然数之和,比如14=2+3+4+5:有些不能,比如8.那么如何判断一个数是否可以写成连续N个自然数之和呢? 一个数M若可以写成以a开头的连续n个自然数之和,则M=a+(a+1)+(a+2)+-+(a+n-1)=n*a+n*(n-1)/2,要求a!=0,否则

【编程练习】正整数分解为几个连续自然数之和

题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列. 一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 15=7+8 有些数可以写成连续N(>1)个自然数之和,比如14=2+3+4+5:有些不能,比如8.那么如何判断一个数是否可以写成连续N个自然数之和呢? 一个数M若可以写成以a开头的连续n个自然数之和,则M=a+(a+1)+(a+2)+-+(a+n-1)=n*a+n*(n-1)/2,要求a!=0,否则

自然数M拆分为连续自然数之和

有些数可以写成连续N(>1)个自然数之和,比如14=2+3+4+5:有些不能,比如8.那么如何判断一个数是否可以写成连续N个自然数之和呢?这是这一节的基本问题. 一个数M若可以写成以a开头的连续n个自然数之和,则M=a+(a+1)+(a+2)+-+(a+n-1)=n*a+n*(n-1)/2,要求a!=0,否则就是以a+1开头的连续n-1个整数了,也就是要求(M-(n+n*(n-1)/2))%n==0,即(M-(n*(n+1)/2))%n==0,这样就很容易判断一个数可不可以写成连续n个自然数的形

C++初学者之根据输入的任何一个正整数,输出可能被表示的连续正整数_C 语言

题目描述:一个正整数有可能可以被表示为 n(>=2) 个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 15=7+8 请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列. 输入数据:一个正整数,以命令行参数的形式提供给程序. 输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的最小正整数开始.以从小到大的顺序打印.如果结果有多个序列,按各序列的最小正整数的大小从小到大打印各序列.此外,序列不允许重复,序列内的整数用

iostream-将一个正整数分解质因数。例如:输入 90, 打印出 90=2*3*3*5

问题描述 将一个正整数分解质因数.例如:输入 90, 打印出 90=2*3*3*5 #include using namespace std; void fnabs(int n) { int i; for(i=2;i<=n;i++) { while(n%i==0) {n/=i; cout<<"*"<<i;} } } int main() { int n; n=90; cout<<n<<"="; fnabs(n);

求完美数

一个数如果恰好等于它的因子之和,这个数就称为"完美数"或"完数".例如6=1+2+3.(6的因子是1,2,3) 完美数的一些性质: 欧几里德证明了:一个偶数是完数,当且仅当它具有如下形式:2(p-1)×(2p-1) 其中p和(2p-1)是素数. 尽管没有发现奇完数,但是当代数学家奥斯丁·欧尔(Oystein Ore)证明,若有奇完全数,则其形状必然是12p+1或36p+9的形式,其中p是素数.在1018以下的自然数中奇完数是不存在的. 除6以外的偶完数,把它的各位数

整数划分算法原理与实现

本文为原创,如需转载,请注明作者和出处,谢谢!     整数划分问题是将一个正整数n拆成一组数连加并等于n的形式,且这组数中的最大加数不大于n.     如6的整数划分为         6     5 + 1     4 + 2, 4 + 1 + 1     3 + 3, 3 + 2 + 1, 3 + 1 + 1 + 1     2 + 2 + 2, 2 + 2 + 1 + 1, 2 + 1 + 1 + 1 + 1     1 + 1 + 1 + 1 + 1 + 1         共11种.