zoukankan      html  css  js  c++  java
  • 洛谷P1147 连续自然数和 [2017年6月计划 数论01]

    P1147 连续自然数和

    题目描述

    对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M。

    例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解。

    输入输出格式

    输入格式:

    包含一个整数的单独一行给出M的值(10 <= M <= 2,000,000)。

    输出格式:

    每行两个自然数,给出一个满足条件的连续自然数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从小到大的升序排列,对于给定的输入数据,保证至少有一个解。

    输入输出样例

    输入样例#1:
    combo.in
    10000
    
    输出样例#1:
    combo.out
    18 142 
    297 328 
    388 412 
    1998 2002
    
    


    小水题,等差数列公式推一推就好了,注意浮点数误差。
     1 #include <bits/stdc++.h>
     2 const int INF = 0x3f3f3f3f;
     3 inline int min(int a,int b){return a > b? b : a;}
     4 inline int max(int a,int b){return a < b? b : a;}
     5 inline int read(long long &x){
     6     x = 0;char ch = getchar();char c = ch;
     7     while(ch > '9' || ch < '0')c = ch, ch = getchar();
     8     while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0',ch = getchar();
     9     if(c == '-') x = -x;
    10 }
    11 long long m;
    12 int main(){
    13     read(m);
    14     for(long long x = 1;x < m;x ++)
    15     {
    16         long long k = x * x - x + 2 * m;
    17         long long y = (long long)(sqrt(1/4.0 - x + x * x + 2 * m) - 1/2.0);
    18         if(y < x)continue;//防止取重 
    19         //防止误差,分别考察y,y-1,y+1 
    20         if(y * y + y == k)printf("%lld %lld
    ", x, y);
    21         y ++;
    22         if(y * y + y == k)printf("%lld %lld
    ", x, y);
    23         y -= 2;
    24         if(y * y + y == k)printf("%lld %lld
    ", x, y);
    25     }
    26     return 0;
    27 }
  • 相关阅读:
    指针符号的优先级
    逆序链表建立和输出
    typedef关键字编写步骤
    CasePlayer2-嵌入式软件静态解析工具
    嵌入式软件测试工具和测试方法
    单元测试必要性
    基于winAMS、CasePlayer2嵌入式软件单元测试
    嵌入式软件测试软件--winAMS支持芯片
    基于模型开发 Back-to-Back测试统合工具-MC-Verifier
    单元测试工具-winAMS
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/6964254.html
Copyright © 2011-2022 走看看