• 连续正整数


    题目描述:一个正整数有可能可以被表示为 n(n>=2) 个连续正整数之和,如:  15=1+2+3+4+5  15=4+5+6  15=7+8 

     请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。  

    输入数据:一个正整数,以命令行参数的形式提供给程序。  输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的最小正整数开始、以从小到大的顺序打印。

    如果结果有多个序列,按各序列的最小正整数的大小从小到大打印各序列。此外,序列不允许重复,序列内的整数用一个空格分隔。如果没有符合要求的序列,输出 “NONE” 。

     

    1 题目分析

    (1)

      从i开始到k的连续k-i+1个数的和为 (k-i+1)(k+i)/2 = N

    (2)

      (k-i+1)(k+i)/2 = N          //假设该正整数为N

          -> k(k+1) = 2N+i(i-1)     

    当i和N一定时就可得出k的值。

          -> k = (-1+sqrt(1+4(2N+i2 -i)))/2

    (3)         

      从1到N/2遍历(以>N/2为起始值的数列不可能满足题意),对于每个i根据得到的k是否是正整数可以判定该起始i是否可以找到一个满足题意的序列。

     2 代码

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int N = 0;
     8     cout<<"input N: ";
     9     cin>>N;
    10     bool NONE = true;
    11     for(int i=1; i<=N/2; ++i)
    12     {
    13         float flag = 1+4*(2*N+i*i-i);
    14         int temp = sqrt(flag);
    15         if(temp*temp == (int)flag)
    16         { 
    17             NONE = false;
    18             int k = (-1+temp)/2;
    19             for(int j=i; j<=k; ++j)
    20                 cout<<j<<" ";
    21             cout<<endl;
    22         }
    23     }
    24     if(NONE)
    25         cout<<"NONE"<<endl;
    26     system("pause");
    27     return 0;
    28 }
    View Code
  • 相关阅读:
    万字长文:大规模 Elasticsearch 高可用集群环境调优实践
    jenkins 配置。
    Xcode的多种Build Configuration
    FZUOJ 2214 Knapsack problem 背包
    Atcoder 070 D Transit Tree Path
    POJ 3903 Stock Exchange LIS
    POJ 2533 Longest Ordered Subsequence 简单DP
    HDU 1260 Tickets 简单DP
    HDU 1114 Piggy-Bank 简单DP
    HDU 1176 免费馅饼 简单DP
  • 原文地址:https://www.cnblogs.com/landy126/p/3339900.html
Copyright © 2020-2023  润新知