将给定数字中所有数字的总和加到给定数字?

时间:2014-01-23 09:06:45

标签: java algorithm

我创建了一个方法,它将在两个给定数字之间添加所有数字的总和,但由于某种原因它不起作用。

public static int sumOfAll(int one, int two)
{
    int bigNumber;
    int smallNumber;
    if(one < two){
        bigNumber = two;
        smallNumber = one;
    }
    else{
        bigNumber = one;
        smallNumber = two;
    }

    return ((smallNumber + bigNumber) / 2) * (bigNumber - smallNumber + 1);
}

这就是方法,这就是我声明方法的方法。

System.out.println(MathOp.sumOfAll(100, 1));

由于某种原因,打印的结果是5000,当它应该是5050.我使用的算法是正确的我在wolframalpha上测试它。我不知道为什么它不在这里工作,任何帮助都会很棒!

5 个答案:

答案 0 :(得分:3)

public static int sumOfAll(int one, int two)
{
    int bigNumber=Math.max(one,two);
    int smallNumber=Math.min(one,two);
    return ((bigNumber+1-smallNumber)*(bigNumber+smallNumber))/2;
}

答案 1 :(得分:1)

为什么不使用求和公式?

http://en.wikipedia.org/wiki/Summation

http://upload.wikimedia.org/math/a/7/4/a74f603449dc34d308b50bbb6acaba1a.png

为此,只需将您的返回代码更改为

return (bigNumber*(bigNumber+1)-smallNumber*(smallNumber-1))/2;

答案 2 :(得分:0)

你可以尝试

吗?
return (int)(((double)(smallNumber + bigNumber) / 2) * (bigNumber - smallNumber + 1));

原因是

正如@devnull指出的那样,当你执行((smallNumber + bigNumber) / 2)时,小数部分会被删除,因为它们被转换为int。因此在进行乘法之前需要显式转换为(double)

答案 3 :(得分:0)

您可以尝试将int更改为double

public static double sumOfAll(int one, int two)
    {
        double bigNumber;
        double smallNumber;
        if (one < two)
        {
            bigNumber = two;
            smallNumber = one;
        }
        else
        {
            bigNumber = one;
            smallNumber = two;
        }

        return ((smallNumber + bigNumber) / 2) * (bigNumber - smallNumber + 1);
    }

答案 4 :(得分:0)

首先,您不需要添加更多代码行,更改方法的返回类型或更改算法。

<强>背景

在划分数字时,在某些情况下,结果为整数。例如2/1 = 2或33/11 = 3.在其他情况下,结果不是整数,如3/2 = 1.5或10/9 = 1.11 ...

在JAVA中,如果尝试使用全数字的数字进行算术运算,结果将产生整数值。例如,2 + 3/5 = 2 + 0.6 。但由于3和5都是整数,JAVA会自动截断结果的小数部分。最后是2 + 0 = 2。

如何解决此问题?

由于您的方法计算“从a到b的数字的包含总和”,因此已知结果将产生整数值。但是return语句包含可能产生双精度值的算术运算。在这种情况下,您可以通过在数字末尾添加“.0”来强制结果获取双倍值,在本例中为2和1:

return ((smallNumber + bigNumber) / 2) * (bigNumber - smallNumber + 1);

那就变成了:

return ((smallNumber + bigNumber) / 2.0) * (bigNumber - smallNumber + 1.0);

由于该方法必须返回整数,因此必须将返回值转换为整数:

return (int) (((smallNumber + bigNumber) / 2.0) * (bigNumber - smallNumber + 1.0));

<强>结果

public static int sumOfAll(int one, int two){
        int bigNumber;
        int smallNumber;
        if(one < two){
            bigNumber = two;
            smallNumber = one;
        }
        else{
            bigNumber = one;
            smallNumber = two;
        }

        return (int) (((smallNumber + bigNumber) / 2.0) * (bigNumber - smallNumber + 1.0));
    }

某些输入和输出
输入:sumOfAll(100,1)---------------------输出:5050
输入:sumOfAll(25,5)-----------------------输出:315
输入:sumOfAll(1000,100)-----------------输出:495550
输入:sumOfAll(80,3)-----------------------输出:3237
输入:sumOfAll(7795,7)--------------------输出:30384889