zoukankan      html  css  js  c++  java
  • 连续整数和问题

    问题描述:

               大部分正整数可以表示2个以上连续整数之和。如:6=1+2+3,9=5+4=2+3+4;

    实验任务:

           连续整数和问题要求计算给定的正整数可以表示为多少个2以上连续整数之和。

    解题过程:

    一个数M若可以写成以a开头的连续n个自然数之和,则M=a+(a+1)+(a+2)+…+(a+n-1)=n*a+n*(n-1)/2,要求a>=1,否则就是以a+1开头的连续n-1个整数了,也就是要求(M-(n*(n-1)/2))除于n大于等于1,(M-(n*(n+1)/2))%n==0,这样就很容易判断一个数可不可以写成连续n个自然数的形式了,遍历n=2…sqrt(2*M+0.25)-0.5,还可以输出所有解。

      

     1 #include<stdio.h>
     2 #include<math.h>
     3 
     4 int ans=0;
     5 void find(int x)
     6 {
     7     int i,a;
     8     for(i=2;i<=sqrt(x*2+0.25)-0.5;i++)
     9     {
    10         if((x-(i*(i-1))/2)%i==0)
    11         {
    12             ans++;
    13             a=(x-(i*(i-1))/2)/i;
    14             printf("%d=",x);
    15             for(int j=0;j<i;j++)
    16             {
    17                 if(j<i-1)
    18                     printf("%d+",a+j);
    19                 else
    20                     printf("%d
    ",a+j);
    21             }
    22         }
    23     }
    24 }
    25 int main()
    26 {
    27     int n;
    28     while(scanf("%d",&n)!=EOF)
    29     {
    30         ans=0;
    31         find(n);
    32         printf("total=%d
    ",ans);
    33     }
    34     return 0;
    35 }
    View Code

    通过编程实验发现,除了2^n以外,其余所有数都可以写成该形式。下面说明为什么。
    若数M符合条件,则有M=a+(a+1)+(a+2)+…+(a+n-1)=(2*a+n-1)*n/2,而2*a+n-1与n肯定一个为奇数一个为偶数,即M一定要有一个奇数因子,而所有2^n都没有奇数因子,因此肯定不符合条件。

    可以证明,只要M有一个奇数因子,就一定可以写成连续n个自然数之和。

          

  • 相关阅读:
    数据结构-链式结构-队列
    c数据结构-线性结构-队列
    栈的四则运算的运用
    C++/C—函数指针
    向显存写数据x8086
    结构体内存偏移量
    MFC-ComboBox控件的使用
    MFC的Edit text编辑框控件
    C/C++反汇编-各种表达式(加减乘)
    MFC- 学习控件-静态文本
  • 原文地址:https://www.cnblogs.com/zeze/p/zhenshuhe.html
Copyright © 2011-2022 走看看