学习指引
* 序、专栏前言
* 一、【例题1】
* 2、解题思路
* 3、模板代码
* 1、方法1
* 1、方法2
* 4 、代码解析
* 二、【例题2】
* 2、解题思路
* 3、模板代码
* 1、方法1
* 2、方法2
* 4 、代码解析
* 三、推荐专栏
* 四、课后习题
序、专栏前言
本专栏开启,目的在于帮助大家更好的掌握学习
​Java​
,特别是一些 ​Java学习者​
难以在网上找到系统地算法学习资料帮助自身入门算法, 同时对于专栏内的内容有任何疑问都可在文章末尾添加我的微信给你进行一对一的讲解。但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。
算法的学习肯定不能缺少总结,这里我推荐大家可以到将学过的知识进行打卡,以此来进行巩固以及复习。
学好算法的唯一途径那一定是 题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。
一、【例题1】
给定一个整数 ,请你输出从的值。
2、解题思路
题目难度:⭐️
朴素的想法,肯定是循环把区间的每一个数都加上,这样的复杂度很明显是级别。但很明显该数列是一个公差为的等差数列,如果我们使用高中学过的等差数列前项和公式,首项为,公差为的前项和公式为:
在公差为的情况下可以优化为:
在更为特殊的公差和首项都为的情况下:
3、模板代码
1、方法1
![【第08天】给定整数 n,求1 + 2 + 3 + ...+ n的和 | 等差数列](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/31024052_62950fb47b5f829555.gif)
import java.util.Scanner;public class Main{ public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int res=0; for (int i = 1; i n; i++) { res+=i; } System.out.println(res); }}
![【第08天】给定整数 n,求1 + 2 + 3 + ...+ n的和 | 等差数列](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/31024052_62950fb47b5f829555.gif)
1、方法2
![【第08天】给定整数 n,求1 + 2 + 3 + ...+ n的和 | 等差数列](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/31024052_62950fb47b5f829555.gif)
import java.util.Scanner;public class Main{ public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); System.out.println(n*(n+1)/2); }}
![【第08天】给定整数 n,求1 + 2 + 3 + ...+ n的和 | 等差数列](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/31024052_62950fb47b5f829555.gif)
4 、代码解析
* 方法采用朴素的办法进行累加,时间复杂度达到,复杂度过高不太可取。
* 方法是直接采用等差数列的求和公式直接得到答案,时间复杂度为。
二、【例题2】
给定多组输入数据,每次给定一个整数 ,请你输出从的值。
2、解题思路
题目难度:⭐️
咋一看,貌似和上题没什么区别。但 的数据范围大了很多,而一道题目是否难,数据范围是一个非常重要的参考因素。在我们的等差数列求和公式中,我们先进行了的操作,在足够大的情况下,是有可能爆
​int​
,造成整数溢出变成负数,所以我们需要做出一些调整。3、模板代码
1、方法1
![【第08天】给定整数 n,求1 + 2 + 3 + ...+ n的和 | 等差数列](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/31024052_62950fb47b5f829555.gif)
import java.util.Scanner;public class Main{ public static void main(String[] args) { Scanner sc=new Scanner(System.in); while (sc.hasNext()){ long n=sc.nextLong(); System.out.println(n*(n+1)/2); } }}
![【第08天】给定整数 n,求1 + 2 + 3 + ...+ n的和 | 等差数列](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/31024052_62950fb47b5f829555.gif)
2、方法2
![【第08天】给定整数 n,求1 + 2 + 3 + ...+ n的和 | 等差数列](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/31024052_62950fb47b5f829555.gif)
import java.util.Scanner;public class test222 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); while (sc.hasNext()){ int n=sc.nextInt(); if (n%2==0) System.out.println(n/2*(n+1)); else System.out.println((n+1)/2*n); } }}
![【第08天】给定整数 n,求1 + 2 + 3 + ...+ n的和 | 等差数列](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230524/31024052_62950fb47b5f829555.gif)
4 、代码解析
* 方法中,由于可能爆
​int​
,我们可以把 ​n​
转换成 ​long​
来使用,这样使用等差数列的过程中就不怕了, ​long​
的取值范围足够我们使用。* 再考虑方法2,在我们等差数列的求和公式中,有一个除
​2​
的步骤,如果我们能先执行该步骤,就能将或者其中的一个值降下来,就不会超出 ​int​
取值范围。* 所以我们应该对此进行分类,当
​n​
为奇数时:* 当
​n​
为偶数时:* 因为
​n​
和 ​n+1​
的奇偶性不同,相乘一定为偶数。当如果需要先进行除以 ​2​
的操作,必须得使用偶数去除。当 ​n​
为偶数则使用 ​n​
,当 ​n​
为奇数说明 ​n+1​
是偶数则使用 ​n+1​
。*
​long​
类型是 ​Java​
的一个基本数据类型,比 ​int​
的储存范围要大一个量级。达到了Original: https://blog.51cto.com/u_15492302/5346185
Author: Java执梗
Title: 【第08天】给定整数 n,求1 + 2 + 3 + …+ n的和 | 等差数列
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/517652/
转载文章受原作者版权保护。转载请注明原作者出处!