黑马程序员技术交流社区

标题: 编写程序计算1+2+3+....+100的和。 [打印本页]

作者: 刘蕴学    时间: 2012-3-10 22:10
标题: 编写程序计算1+2+3+....+100的和。
        public static void main(String[] args)
        {
                int sum = 0;
            for(int i = 100;i>0;i--)
            {
                    sum+=i;
            }
            System.out.println(sum);
        }
我这里用了一个优化,就是把与100做比较变成了与0做比较,速度略快,想问下你们还有更好的方案没有?
作者: 房宝彬    时间: 2012-3-10 22:13
好像用 while 效率比for快
作者: 刘蕴学    时间: 2012-3-10 22:14
等我做下测试看看,不习惯用while,不好控制流程
作者: 黑马肖凯骏    时间: 2012-3-10 22:19
既然求和,还是用100判断比较直观些吧!
作者: 黑马张平    时间: 2012-3-10 22:20
一样的速度吧!
作者: 刘蕴学    时间: 2012-3-10 22:40
黑马张平 发表于 2012-3-10 22:20
一样的速度吧!

参见think in java,貌似是这本里的优化讲解那
作者: 葛尧    时间: 2012-3-10 23:24
优化啊,用数学公式。。
作者: 石德志    时间: 2012-3-11 10:33
解决问题就行
作者: baypm_jy    时间: 2012-3-11 13:56
递归实现

package com.iwit.test;

public class Testa {

        /*
         * 思路:先求每项的,后再求和即可
         */
        public static void main(String[] args) {
                int sum = 0;
                for (int i = 1; i <= 100; i++) {
                        sum += getPerItem(i);
                }
                System.out.println(sum);
        }

        public static long getPerItem(int i) {
                if (i == 1)
                        return 1;
                else
                        return 1 + getPerItem(i - 1);
        }
}

作者: 许前刚    时间: 2012-3-11 14:11
其实大数学家高斯十岁的时候就有非常快速的解法:1+2+3+...+n=(1+n)*n/2
作者: 刘蕴学    时间: 2012-3-11 15:18
         /**
         * 得到1与参数e之间(包含1和e)所有数的和,
         * @param e 表示需要求和数的最后一个,e必须为整数,浮点类型紧为了保证结果
         * @return 这些数的和
         */
        public static int getSum(float e)
        {
                return (int)((1+e)*(e/2));
        }

呵呵,按照楼上的写了一个函数,效率比循环快的太多了,不过话说高中数学都忘记的差不多了,表达式都不会做了
作者: 袁野    时间: 2012-3-11 15:43
没有区别吧  100 还是 0 觉得没什么区别
作者: 刘蕴学    时间: 2012-3-11 16:31
袁野 发表于 2012-3-11 15:43
没有区别吧  100 还是 0 觉得没什么区别

底层对比总是0快
作者: 张希强    时间: 2012-3-11 16:47
用数学公式,时间复杂度高下立判。
        public static int sumType1(int beginNum ,int endNum)//输入开始与结束的数字公差是1
        {
                int sum=(beginNum+endNum)*(endNum-beginNum+1)/2;                       
                return sum;               
        }
        public static int sumType2(int beginNum,int endNum,int dex)//输入第一项第n项以及公差
        {
                int count =(endNum-beginNum)/dex +1;                  
                return count*beginNum+(count-1)*(count)*dex/2;
        }




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2