zoukankan      html  css  js  c++  java
  • 【编程实践】连续正整数之和(华东师范大学OJ-3025)

    题目描述:一个正整数有可能可以被表示为 n(n>=2) 个连续正整数之和,如:

    15=1+2+3+4+5 15=4+5+6 15=7+8

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

    输入数据:一个正整数,以命令行参数的形式提供给程序。

    输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的最小正整数开始、以从小到大的顺序打印。如果结果有多个序列,按各序列的最小正整数的大小从小到大打印各序列。此外,序列不允许重复,序列内的整数用一个空格分隔。如果没有符合要求的序列,输出 “NONE” 

    例如,对于 15 ,其输出结果是: 1 2 3 4 5 4 5 6 7 8 对于 16 ,其输出结果是: NONE

     

     

    分析:

     
    n(1+n)/2 <= m (设n最大的值为max) 
    max= (int) sqrt( m ) * sqrt( 2 ) 
    start = m / n – (n – 1)/2 是否为整数?
    如果是整数,就符合条件,end = start + n,显示 start to end
     
     
    程序实现:
     
     1 #include <stdio.h>
     2 #include <math.h>
     3 int main()
     4 {  int m=0,n=0,start=0,end=0,flag=0;  //m为输入的数,n为正整数序列个数,start为显示的开始正整数,end为显示的结束正整数,flag表示有无符合条件的序列存在,
     5                                                           //0(默认)没有,1有
     6  float temp=0.0;  
     7 printf("please input a Integer:");
     8  scanf("%d",&m);  
     9 printf("/n");
    10  n=(int) (sqrt(m)*sqrt(2));                 //求出可能的最大的序列个数
    11  while(n>=2)
    12 {  temp=(float)m/n-(float)(n-1)/2;     //求开始数  
    13 if(temp==(int) temp){                     //判断是不是正整数,即有没有符合符合条件的序列存在
    14  for(flag=1,start=(int) temp,end=start+n;start<end;start++) {      //flag标志置1,有符合符合条件的序列存在,得出开始整数start和结束整数end  
    15 printf("%d",start);  printf(" ");  }  
    16 printf("/n");
    17  }
    18  n--;
    19  }
    20  if(flag==0)                          //没有符合符合条件的序列存在,则输出"none"  
    21 printf("none");
    22  return 0;
    23  }
     
    What doesn't kill you makes you stronger,stand a little taller Doesn't mean I'm lonely when I'm alone. What doesn't kill you makes a fighter,Footsteps even lighter Doesn't mean I'm over cause you're gone. ————即便生命枯竭,亦在优雅中变老。
  • 相关阅读:
    E
    D
    C
    B
    Python
    IDEA 设置资源目录
    光猫指示灯含义
    IO模型
    Linux 总目录
    Linux python 使用
  • 原文地址:https://www.cnblogs.com/yexu200241/p/3720643.html
Copyright © 2011-2022 走看看