当前位置: 代码迷 >> Eclipse >> 种与对象-连续自然数和
  详细解决方案

种与对象-连续自然数和

热度:37   发布时间:2016-04-23 02:04:00.0
类与对象-连续自然数和
描述 Description

对一个给定的自然数M,求出所有的连续的自然数段(连续个数大于1),这些连续的自然数段中的全部数之和为M。
例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个自然数段为M=10000的一个解。

要求:(1)要求用类的方法解题

定义一个类Number,类里面有三个私有的数据成员begin和end和sum

(2)要求在类中设计一个构造函数,此构造函数接受一个整数作为参数,此整数即为在主程序中接收的自然数M,这个M用来初始化sum

(3)要求在程序中设计一个成员函数solve(),此函数利用sum来求自然数begin和end,并且在函数中直接显示begin和end的值


样例输入
10000
样例输出
18 142
297 328
388 412
1998 2002

求怎样用类解题~
------最佳解决方案--------------------
假设输入一个数10.
外层循环从1开始,到5.
begin=1,然后sum累加,end 从begin(1)开始。
 sum=sum+end;(1=0+1) 1<10  end++ -->2
 sum=sum+end;(3=1+2) 3<10  end++ -->3
 sum=sum+end;(6=3+3) 6<10  end++ -->4 
 sum=sum+end;(10=6+4) 10=10  里层循环结束。
判断sum=M,输出 begin=1,end-1=4.


外层循环再从 begin=2,sum=0开始累加,
 sum=sum+end;(2=0+2) 2<10  end++ -->3
 sum=sum+end;(5=2+3) 5<10  end++ -->4
 sum=sum+end;(9=5+4) 9<10  end++ -->5 
 sum=sum+end;(14=9+5) 14》10  里层循环结束。
 不匹配,里层循环结束,(没有输出)。

外层循环从begin=3,sum=0 再累加,判断
。。。。。。。

基本过程就是这样。
感觉应该有更精准的办法,我这个数据大时,效率不高。
------其他解决方案--------------------
仅供楼主参考:

import java.util.Scanner;
class ContinueNumber
{
private int M;
private int begin=0; //数段起始数。
private int end=0; //结尾数。
private int sum=0;
private int total=0;
public ContinueNumber(int M)
{
this.M=M;
}
public void solve()
{
for(begin=1; begin<M/2+1; begin++) //超过一半,就不会存在了.
{
sum=0;
for(end=begin;sum<M;end++)
{
sum+=end;
}
if(sum==M)
{
total++;
System.out.println(""+begin+"  "+(end-1));
}
}
if(total==0)
{
System.out.println("Can't find any continued segments!");
}
else
{
System.out.println("Hi! Find "+total+" segements!");
}
}
}
public class ContinueNumberTest
{
public static void main(String[] args)
{
System.out.println("Please input the Number M:");
Scanner scan=new Scanner(System.in);
int m=scan.nextInt();
ContinueNumber cn=new ContinueNumber(m);
cn.solve();
}
}

------其他解决方案--------------------
引用:
仅供楼主参考:


Java code?



12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849

import java.util.Scanner; class ContinueNumber {     private int M;     priv……

谢谢!又学习了,
public ContinueNumber(int M)     {         this.M=M;     }     public void solve()     {         for(begin=1; begin<M/2+1; begin++)             //超过一半,就不会存在了.         {             sum=0;             for(end=begin;sum<M;end++)             {                 sum+=end;             }             if(sum==M)             {                 total++;                 System.out.println(""+begin+"  "+(end-1));             }         }         if(total==0)         {             System.out.println("Can't find any continued segments!");         }         else        {             System.out.println("Hi! Find "+total+" segements!");         }     } } 
  相关解决方案