数学-算法
一、数学算法
1、高斯算法
以首项加末项乘以项数除以2来计算“1+2+3+4+5+···+(n-1)+n”的结果。这样的算法被称为高斯算法。
算法由来
高斯小时候非常淘气,一次数学课上,老师为了让他们安静下来,给他们列了一道很难的算式,让他们一个小时内算出1+2+3+4+5+6+……+100的得数。全班只有高斯用了不到20分钟给出了答案,因为他想到了用(1+100)+(2+99)+(3+98)……+(50+51)……一共有50个101,所以50×101就是1加到一百的得数。后来人们把这种简便算法称作高斯算法。
计算方法
求结果
结果的计算方法: (首项 + 末项)* 项数 / 2
例1:1+2+3+4+5+······+10,公式为:(1+10) * 10 / 2 = 55
例2:1+2+3+4+5+······+100,公式为:(1+100) * 100 / 2 = 5050
例3:2+4+6+8+······+20,公式为:(2+20) * 10 / 2 = 110
例4:1+2+3+4+5+······+n,公式为:(1+n) *n / 2
例5:2+4+6+8+10+······+n,公式为:(2+n) * [(n-2)/2+1] / 2
求项数
项数的计算方法:(末项 - 首项) / 项差 + 1
项差: 每项之间的差。例:1+2+3+4+5+······,项差为1
例1:1+2+3+4+······+10,项数为:(10-1) / 1+1 = 10
例2:4+8+12+16+······+28,项数为:(28-4) / 4+1 = 7
人物介绍
约翰·卡尔·弗里德里希·高斯(Johann Carl Friedrich Gauss ,1777年4月30日-1855年2月23日)德国著名数学家、物理学家、天文学家、大地测量学家,是近代数学奠基者之一,被认为是历史上最重要的数学家之一,并享有“数学王子”之称。
高斯和阿基米德、牛顿并列为世界三大数学家。一生成就极为丰硕,以他名字“高斯”命名的成果达110个,属数学家中之最。他对数论、代数、统计、分析、微分几何、大地测量学、地球物理学、力学、静电学、天文学、矩阵理论和光学皆有贡献。
2、等差数列求和
一般地,如果一个数列从第二项起,每一项与它的前一项的差等于同一个常数,这个数列称为等差数列,这个常数称为等差数列的公差,用字母d表示,等差数列的首项用a1表示。一般地,Sn=a1+a2+a3+…+an,我们称Sn为数列{an}的前n项和,等差数列的前n项和的求和公式为Sn=n(a1+an)/2,也可以表示为Sn=na1+n(n-1)d/2。
公式
对于等差数列,前n项的和的求和公式为:
推导
倒序相加法
高斯10岁时,他的算术老师出了一道题目,求1+2+3+…+100的结果,高斯给出了一种巧妙的解法:1+2+3+…+100=(1+100)+(2+99)+…+(50+51)=101×50=5050. 将这个算法推广到公差为d的任意等差数列{an}中,就可以得到等差数列的求和公式。
/*** 等差数列求和** @param a1:开始项* @param d:公差* @param n:项数* @return*/private static int arithmeticSeriesSum(int a1, int d, int n) {return (a1 + a1 + (n - 1) * d) * n / 2;}
2829. k-avoiding 数组的最小总和 - 力扣(LeetCode)
//贪心 + 等差数列求和// 根据题目要求,在k是奇数的情况下,如果某个正整数a在数组中,那么k-a肯定不能在数组中。// 反过来也一样。但是题目要求总和最小,因此我们肯定是将这两个数字中小的放入数组,// 并且从1开始挑选数字放入数组,直到k/2为止。这之后的数字到k-1为止,都不能放入数组。// 如果这时数字还没到到达n个,我们需要从k开始,再挑选连续的 k−k/2个数字加入数组。因此最后的数组和是一段或者两段等差数列求和。public static int minimumSum(int n, int k) {if (n <= k / 2) {return arithmeticSeriesSum(1, 1, n);} else {return arithmeticSeriesSum(1, 1, k / 2) + arithmeticSeriesSum(k, 1, n - k / 2);}}/*** 等差数列求和** @param a1:开始项* @param d:公差* @param n:项数* @return*/private static int arithmeticSeriesSum(int a1, int d, int n) {return (a1 + a1 + (n - 1) * d) * n / 2;}
数据结构和算法(一)
再小的努力,乘以365都很明显!
每天⽤⼼记录⼀点点。内容也许不重要,但习惯很重要!
一个程序员最重要的能力是:写出高质量的代码!!
有道无术,术尚可求也,有术无道,止于术。
无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!