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

  将一个正整数表示为连续自然数的和,比如给定整数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 }

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

时间: 2024-12-28 20:36:30

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

[Java] [刷题] 连续自然数和

题目描述 对一个给定的自然数M,求出所有的连续的自然数段(连续个数大于1),这些连续的自然数段中的全部数之和为M. 例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解. 输入 包含一个整数的单独一行给出M的值(10 <= M <= 1000000000) 10000 输出 每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从小到大的升序排列,对于

luogu P1147 连续自然数和 x

P1147 连续自然数和 题目描述 对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M. 例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解. 输入输出格式 输入格式: 包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000). 输出格式: 每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从

P1147 连续自然数和

题目描述 对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M. 例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解. 输入输出格式 输入格式: 包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000). 输出格式: 每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从小到大的升序排列,对于给定

luogu P1147 连续自然数和

题目描述 对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M. 例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解. 输入输出格式 输入格式: 包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000). 输出格式: 每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从小到大的升序排列,对于给定

爱根,明天就能见到你了!好!亢!奋!闲来无聊,将一个正整数分解成质因数!

1 #闲来无聊,将一个正整数分解成质因数,例如900=2*3*3*3*5*5. 2 3 #1.用while循环结合for循环做. 4 # while True: 5 # num=input("input a num:") #输入数字. 6 # if num: #如果输入了: 7 # num=int(num) #转化为字符串. 8 # List=[str(num),"="] #先将这个数字加到列表开头,创造输出格式. 9 # while num>=2: #当这个

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

import java.util.Scanner; /*题目:将一个正整数分解质因数.例如:输入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的值,重复执行第一步.*/ public class Test

连续自然数和

题目描述 对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M. 例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解. 输入输出格式 输入格式: 包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000). 输出格式: 每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从小到大的升序排列,对于给定

1147 连续自然数和

难度:普及- 题目类型:简单数学问题 提交次数:1 涉及知识:简单数学问题 题目描述 对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M. 例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解. 输入输出格式 输入格式: 包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000). 输出格式: 每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个

将一个正整数分解质因数

将一个正整数分解质因数                         #include <stdio.h> int main() { int n,i; printf("请输入一个数:\n"); scanf("%d",&n); printf("%d=",n); for(i=2;i<=n;i++) while(n!=i) { if(n%i==0) { printf("%d*",i); n=n/i; }