public class  A
{
public static void main(String[] args) 
{
int demo;
 for (int i = 1; i < 50; i++)
                for (int j = i + 1; j < 100; j++)
                    for (int k = j + 1; k < 100; k++)
                        for (int l = k + 1; l < 100; l++)
                            for (int m = l + 1; m < 100; m++)
                                if ((i + j + k + l + m) == 100)
 
System.out.println(i,j,k,l,m);
}
}
谁有更好的方法
或者可以将这个程序进行完整修改
希望你的电脑不会死机

解决方案 »

  1.   

    楼主原方法改写:
        public static void main(String[] args) {
            long start = System.currentTimeMillis();
            int counter = 0;
            int result = 0;
            for (int i = 1; i < 50; i++) {
                for (int j = i + 1; j < 100; j++) {
                    for (int k = j + 1; k < 100; k++) {
                        for (int l = k + 1; l < 100; l++) {
                            for (int m = l + 1; m < 100; m++) {
                                if ((i + j + k + l + m) == 100) {
                                    System.out.println(i + " " + j + " " + k + " " + l + " " + m);
                                    result++;
                                }
                                counter++;
                            }
                        }
                    }
                }
            }
            long end = System.currentTimeMillis();
            System.out.println("得到" + result + "个结果; 花费时间:" + (end - start) + "毫秒; 循环次数:" + counter);
        }输出:
    得到25337个结果; 花费时间:1547毫秒; 循环次数:69404384改进后的方法:
        public static void main(String[] args) {
            long start = System.currentTimeMillis();
            int counter = 0;
            int result = 0;
            for (int i = 1; i < 50; i++) {
                for (int j = i + 1; j < 100 && i + j <= 100; j++) {
                    for (int k = j + 1; k < 100 && i + j + k <= 100; k++) {
                        for (int l = k + 1; l < 100 && i + j + k + l <= 100; l++) {
                            for (int m = l + 1; m < 100 && i + j + k + l + m <= 100; m++) {
                                if ((i + j + k + l + m) == 100) {
                                    System.out.println(i + " " + j + " " + k + " " + l + " " + m);
                                    result++;
                                }
                                counter++;
                            }
                        }
                    }
                }
            }
            long end = System.currentTimeMillis();
            System.out.println("得到" + result + "个结果; 花费时间:" + (end - start) + "毫秒; 循环次数:" + counter);
        }输出:
    得到25337个结果; 花费时间:641毫秒; 循环次数:480512
      

  2.   

    System.out.println(i + " " + j + " " + k + " " + l + " " + m);
    这一句占用大量时间!去掉之后的输出为:得到25337个结果; 花费时间:16毫秒; 循环次数:480512
      

  3.   

    个人得到的最终优化结果:
        public static void main(String[] args) {
            long start = System.currentTimeMillis();
            int counter = 0;
            int result = 0;
            for (int i = 1; i < 50; i++) {
                for (int j = i + 1; i + j <= 100; j++) {
                    for (int k = j + 1; i + j + k <= 100; k++) {
                        for (int l = k + 1; i + j + k + l <= 100; l++) {
                            for (int m = l + 1; i + j + k + l + m <= 100; m++) {
                                if ((i + j + k + l + m) == 100) {
                                    result++;
                                }
                                counter++;
                            }
                        }
                    }
                }
            }
            long end = System.currentTimeMillis();
            System.out.println("得到" + result + "个结果; 花费时间:" + (end - start) + "毫秒; 循环次数:" + counter);
        }输出:
    得到25337个结果; 花费时间:0毫秒; 循环次数:480512我都不知道是怎么回事了。
      

  4.   

    回复人:YidingHe(机枪兵) ( 四级(中级)) 信誉:100  2007-02-26 01:06:41  得分:0 
    System.out.println(i + " " + j + " " + k + " " + l + " " + m);
    这一句占用大量时间!去掉之后的输出为:得到25337个结果; 花费时间:16毫秒; 循环次数:480512
    没有输出结果啊
      

  5.   

    重新写了一下,现在得到最少的循环次数了:
    http://yiding-he.javaeye.com/blog/55704
      

  6.   

    重新写了一下,现在得到最少的循环次数了:
    http://yiding-he.javaeye.com/blog/55704题目是:i,j,k,l,m 5个互不相等的话估计有问题
    1,2,3,94/2,94/2 这个...lz 的题目是什么?
      

  7.   

    前面有帖子提过了啊.
    忘了帖子名了,不过高人们是这样写的
    for (int i = 1; i < 20; i++) {
                
    后面忘了......
      

  8.   

    改成
    ;i<=18;
    ;j<=23;
    ;k<=31;
    ;l<=46;
    ;m<=90;
      

  9.   

    getPassion() ( ) 
    题目是求1-100之间,五个不同数字之和为100的组合有那些(与顺序无关)
    这个题目我也来做一个  ~  不过输出结果多了点  这题出的不好public class Test{
    public static void main(String[] args){
    int n = 0,count=0;
    long start,stop;
    start = System.currentTimeMillis();
    for(int i=1;i<=20;i++){
    for(int j=i+1;j<=40;j++){
    for(int k=j+1;k<=60 && i+j+k<100;k++){
    for(int g=k+1;g<=80 && i+j+k+g<100;g++){
    for(int h=g+1;h<=100 && i+j+k+g+h<=100;h++){
    if((i+j+k+g+h)==100){
    System.out.println(i+" "+j+" "+k+" "+g+" "+h);
    n++;
    }
    count++;
    }
    }
    }
    }
    }
    stop = System.currentTimeMillis();
    System.out.println("数量"+n+"\t时间"+(stop-start)+"循环次数"+count);
    }
    }
    输出:数量25337  时间2937  循环次数480512循环次数统计有问题 实际次数应该比这多 但不会太离谱
      

  10.   

    ;i<=18;
    ;j<=23;
    ;k<=31;
    ;l<=46;
    ;m<=90;
    这个好
      

  11.   

    for(int a = 1;a <= 18;a++)
       for(int b = a + 1;a + b <= 37;b++)
          for(int c = b + 1;a + b + c <= 57;c++)
             for(int d = c + 1;a + b + c +d <= 78;d++)
             {
                int e = 100 - a - b - c - d; 
                 if(e > d){
                         System.out.println();
                 }
             }
    得到25337个结果; 花费时间:10毫秒; 循环次数:50523
      

  12.   

    http://yiding-he.javaeye.com/blog/55704
    此处的程序运行结果为:
    得到25337个结果; 花费时间:656毫秒; 循环次数:25337其实并不是只循环了25337次,只是执行到最内层循环的只有25337次
    有很多循环可能在第三层被终止了。从根本上,决定类似程序效率的是运算次数以及开销,并不是内层循环的次数。
      

  13.   

    int counter = 0;
            int result = 0;
            for (int i = 1; i <= 100/5; i++) {
                for (int j = i + 1; j <= (100 - i)/4; j++) {
                    for (int k = j + 1; k <= (100 - i - j)/3; k++) {
                        for (int l = k + 1; l <= (100 - i - j - k)/2; l++) {
                            if ((i + j + k + l * 2) < 100) {
                                result++;
                            }
                            counter++;
                        }
                    }
                }
            }这个应该是比较好的结果了
      

  14.   

    for (int i = 1; i * 5 < 100; i++)
                {
                    for (int j = i + 1; j * 4 < (100 - i); j++)
                    {
                        for (int k = j + 1; k * 3 < (100 - i - j); k++)
                        {
                            for (int l = k + 1; l * 2 < (100 - i - j - k); l++)
                            {
                                result++;
                                counter++;
                            }
                        }
                    }
                }更好一点的
      

  15.   

    菜鸟来说一句
    此题的关键在于界定五个数的范围,无疑很多朋友注意到将五个数排序输出是个不错的选择。
    {(x1,x2,x3,x4,x5)|x1<x2<x3<x4<x5,x1+x2+x3+x4+x5=100}问题转化为求该方程组的解。
    一般地,将参数限定在等价于原方程的区域内是最佳的限定。
    至于怎么去寻找等价条件,很简单,初中一定学过。
    5*x1+1+2+3+4<=100 ======> x1<=18
    x2>x1 x1+x2 <= 37
    x3>x ........