面试时遇到一个面试题:请写一个java类,求1 加到100的总和
我写的是
for循环
但面试官说不行,我想问一下最优解是什么
直接用数学公式啊
总和=n * (n+1)/2。这里n等于100
如果扩展到求一个连续值之和,假设起始数为n,结束数为m,那么:
总和 = n * (m-n+1) + (m-n) * (m-n+1) / 2
该回答引用ChatGPT
对于这个问题,最简单的解决方法是使用等差数列求和公式,该公式可以用于计算从1加到n的总和,其中n为正整数。
公式为:S = (n/2) * (a1 + an),其中S表示总和,n表示项数,a1表示第一项,an表示最后一项。
将题目中的范围限定在1到100,我们可以把公式中的n设为100,a1设为1,an设为100,带入公式得到:
S = (100/2) * (1 + 100) = 5050
因此,最优的解决方法是直接使用等差数列求和公式,而不是使用for循环进行累加。这种方法的时间复杂度为O(1),比使用for循环的时间复杂度O(n)更优。
以下答案引用自GPT-3大模型,请合理使用:
最优解是使用数学公式求和:
S = (N*(N+1))/2;
其中N为1到100的总和,也就是100。
因此实现代码如下:
public class SumTest {
public static void main(String[] args){
long sum = 0;
long N=100;
sum=(N*(N+1))/2;
System.out.println(sum);
}
}
如果我的回答解决了您的问题,请采纳我的回答
等差数列前n项和 首项加末项 乘以项数 再除以2
你这个for循环直接从1加到100,这个编程的思想是面向过程的啊,面试官是叫你写一个类,什么是类呀?兄弟
这个问题不是考你会不会写1到100的加法,而且考你面向对象的编程思想,怎么样封装一个可以计算任何区间的数相加的一个类,你应该做的是起码封装一个函数,函数有三个参数,最大值,最小值,以及间隔(即等差数列的差值),这样的话,不管是求1-100的和,还是2-2000的和都可以调用这一个函数就能完成,这才是面向对象呀,兄弟