本案例要求使用交互的方式找出从 2 开始到某个数值范围内的所有质数,并输出结果。因为输出的质数可能较多,要求分行输出,每行最多输出 10 个质数。程序的交互过程如图-1所示:
图- 1
注:质数又称素数,指在大于1的自然数中,除了1和此整数自身外,不能被其它自然数整除的数。
参考答案
首先, 使用Scanner类接收控制台输入的一个大于 2 的整数 max,表示查找的范围。
其次,使用 for 循环从数值 2 开始进行判断,判断该数值是否为质数,然后判断数值 3、数值4 … ,逐一判断到 max 为止。
第三,判断某个数值是否为质数,需要在第二步的for循环内嵌套使用 for 循环。那么如何判断一个数是否为质数呢,如果一个数 n 不是质数,那么它一定是某两个整数的乘积。此时,如果其中一个整数大于 n 的平方根,那么必定能找到一个小于 n 的平方根的整数和它成对。例如,81的平方根是9,那么,我们只需要判断从2到9之间是否有整数可以整除 81 即可。因此,在判断数值 n 是否为质数时,需要让 n 除以 2 到 n 的平方根之间的每一个整数。在此范围内,如果 n 能被2 到 n (n大于2)的平方根之间的某个数整除,则说明n不是质数,否则n一定是质数。
最后,如果判断某个数值确实是质数,则需要记载质数的个数,并将该质数输出。为保证输出的美观,要求每行最多输出 10 个数值。因此,输出时,需要判断质数的总个数是否可以被 10 整除。如果不可以被 10 整除,则输出在同一行,数值之间用空格隔开,否则,输出到下一行。
实现此案例需要按照如下步骤进行。
步骤一:定义类及 main 方法
首先定义一个名为 PrimeNumber的类,并在类中定义Java 应用程序的入口方法main ,代码如下所示:
import java.util.Scanner; public class PrimeNumber { public static void main(String[] args) { } }
步骤二:读取控制台的输入
在main方法中,实例化Scanner类,并调用Scanner类的nextInt方法接收用户从控制台输入的表示查找范围的数值,使用完毕后将scanner对象关闭。代码如下所示:
import java.util.Scanner; public class PrimeNumber { public static void main(String[] args) { #cold_bold Scanner scanner = new Scanner(System.in); #cold_bold System.out.print("请输入查找质数的范围:2~"); #cold_bold int max = scanner.nextInt(); #cold_bold scanner.close(); } }
步骤三:查找质数
使用双层for循环判断某个数是否为质数,其中,外层循环用于循环判断某范围内的每个数值; 内层循环用于判断某个数是否为质数。
在判断数值 n 是否为质数时,需要让 n 除以 2 到 n 的平方根之间的每一个整数。在此范围内,如果 n 能被2 到 n (n大于2)的平方根之间的某个数整除,则说明n不是质数,直接进入下一次质数的判断即可。代码如下所示:
import java.util.Scanner; public class PrimeNumber { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入查找质数的范围:2~"); int max = scanner.nextInt(); scanner.close(); #cold_bold int numOfPrime = 0; #cold_bold for (int n = 2; n <= max; n++) { #cold_bold // 判断n是否是质数 #cold_bold int m = (int) Math.sqrt(n); #cold_bold int i = 2; #cold_bold for (; i <= m; i++) { #cold_bold if (n % i == 0) #cold_bold break; #cold_bold } #cold_bold } } }
步骤四:输出结果
如果内层循环结束后,发现计数器 i 的值大于 n 的平方根的整数部分,则说明 n 没有被2 到 n (n大于2)的平方根之间的任何一个数整除,即n 为质数。此时,需要记载质数的总个数,并以每行 10 个数值的方式输出结果。代码如下所示:
import java.util.Scanner; public class PrimeNumber { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入查找质数的范围:2~"); int max = scanner.nextInt(); scanner.close(); int numOfPrime = 0; for (int n = 2; n <= max; n++) { // 判断n是否是质数 int m = (int) Math.sqrt(n); int i = 2; for (; i <= m; i++) { if (n % i == 0) break; } #cold_bold if (i > m) { #cold_bold System.out.print(n + " "); #cold_bold if (++numOfPrime % 10 == 0) #cold_bold System.out.println(); #cold_bold } } #cold_bold System.out.println("\n共有" + numOfPrime + "个质数"); } }
本案例的完整代码如下所示:
import java.util.Scanner; public class PrimeNumber { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入查找质数的范围:2~"); int max = scanner.nextInt(); scanner.close(); int numOfPrime = 0; for (int n = 2; n <= max; n++) { // 判断n是否是质数 int m = (int) Math.sqrt(n); int i = 2; for (; i <= m; i++) { if (n % i == 0) break; } if (i > m) { System.out.print(n + " "); if (++numOfPrime % 10 == 0) System.out.println(); } } System.out.println("\n共有" + numOfPrime + "个质数"); } }
参考答案
int[]是一种数据类型,是引用类型。与int类型,double类型类似,一样可以使用该类型定义变量。
参考答案
对数组进行初始化,方式一的代码为:
int[] arr={23,45,19,34};
上述数据初始化的方式为定义的同时对数据进行赋值。
方式二的代码为:
int[] arr=new int[4];
上述初始化方式为只指定数组的长度,由系统为每个数组元素指定初始值。
创建程序,实现查询数组中最小值的功能,并将最小值放入数组的第一位。需求为:创建一个长度为 10 的数组,数组内放置 10 个 0 到 99 之间(包含0,包含99)的随机整数作为数组元素,要求查询出数组中的最小值,并打印显示在界面上。然后,将数组的长度扩容为 11,将查询到的数组最小值记载为数组的第一个元素,并打印扩容后的数组的内容。界面效果如图-2所示:
图- 2
参考答案
首先需要创建一个长度为 10 的整型数组,然后使用 for 循环来产生 10 个 0 到 99 之间的随机整数,并放入数组;
然后查询数组中的最小值,并打印显示结果。
第三,首先将原始组进行扩容,形成新数组。然后,可以使用 System 类的 arraycopy() 方法实现数组的拷贝,代码如下所示:
int[] arrNew = new int[arr.length + 1]; System.arraycopy(arr, 0, arrNew, 1, arrNew.length-1);
如果数组 arr 的长度为 10,那么,上述代码将产生一个长度为 11 的新数组 arrNew,且此数组中的后 10 个元素和数组 arr 中的10个元素相同。
最后,将查询到的最小值放入新数组的第一个位置上,并打印新数组的内容即可。
实现此案例需要按照如下步骤进行。
步骤一:定义类及 main方法
首先定义一个名为 MinOfArray的类,并在类中添加Java应用程序的主方法main,代码如下所示:
public class MinOfArray{ public static void main(String[] args) { } }
步骤二:创建数组
在 main 方法中创建一个长度为 10 的数组,代码如下:
public class MinOfArray { public static void main(String[] args) { //创建一个 10 个长度的数组 #cold_bold int[] arr = new int[10]; } }
步骤三:数组的赋值
使用 for 语句构建一个 10 次的循环,在每次循环中,随机产生一个 0到99之间的整数,并存入数组。
此案例中,使用 Random 类的 nextInt方法产生随机数。代码如下所示:
#cold_boldimport java.util.Random; public class MinOfArray { public static void main(String[] args) { //创建一个 10 个长度的数组 int[] arr = new int[10]; #cold_bold //随机生成 10 个0-99之间的数值,放入数组 #cold_bold Random ran = new Random(); #cold_bold for(int i=0;i<arr.length;i++){ #cold_bold arr[i] = ran.nextInt(100); #cold_bold } } }
注意:此步骤中,需要导入java.util包下的Random类。
步骤四:打印数组内容
数组赋值后,为方便用户查看数组中的数据内容,需要将数组中的数据打印在界面上。因此,需要使用Arrays类的toString方法来得到数组的内容。代码如下所示:
import java.util.Random; #cold_boldimport java.util.Arrays; public class MinOfArray { public static void main(String[] args) { //创建一个 10 个长度的数组 int[] arr = new int[10]; //随机生成 10 个0-99之间的数值,放入数组 Random ran = new Random(); for(int i=0;i<arr.length;i++){ arr[i] = ran.nextInt(100); } #cold_bold //打印数组中的数据 #cold_bold System.out.println("数组中的数据为:" + Arrays.toString(arr)); } }
注意:此步骤中,需要导入java.util包下的Arrays类。
步骤五:查询最小值
为找到数组中的最小值,依然需要使用循环来遍历数组。先定义一个变量 min 用于表示最小值,并赋初始值为数组中的第一个数值;然后依次把数组中的元素与变量 min 进行数值比较,如果数组中的某元素的数值小于 min,则将该元素的数值存入变量 min,并将最小值输出。代码如下所示:
import java.util.Random; import java.util.Arrays; public class MinOfArray { public static void main(String[] args) { //创建一个 10 个长度的数组 int[] arr = new int[10]; //随机生成 10 个0-99之间的数值,放入数组 Random ran = new Random(); for(int i=0;i<arr.length;i++){ arr[i] = ran.nextInt(100); } //打印数组中的数据 System.out.println("数组中的数据为:" + Arrays.toString(arr)); #cold_bold //查询最小值 #cold_bold int min = arr[0]; #cold_bold for(int i=1; i<arr.length; i++) { #cold_bold if(min > arr[i]) { #cold_bold min = arr[i]; #cold_bold } #cold_bold } #cold_bold System.out.println("最小值是:" + min); } }
步骤六:数组扩容
创建新数组,新数组的长度,在原数组长度的基础上增加1。且此数组中的后 10 个元素和原数组中的10个元素相同,代码如下所示:
import java.util.Random; import java.util.Arrays; public class MinOfArray { public static void main(String[] args) { //创建一个 10 个长度的数组 int[] arr = new int[10]; //随机生成 10 个0-99之间的数值,放入数组 Random ran = new Random(); for(int i=0;i<arr.length;i++){ arr[i] = ran.nextInt(100); } //打印数组中的数据 System.out.println("数组中的数据为:" + Arrays.toString(arr)); //查询最小值 int min = arr[0]; for(int i=1; i<arr.length; i++) { if(min > arr[i]) { min = arr[i]; } } System.out.println("最小值是:" + min); #cold_bold //创建新数组 #cold_bold int[] arrNew = new int[arr.length + 1]; #cold_bold //将原数组的元素拷贝进入新数组 #cold_bold System.arraycopy(arr, 0, arrNew, 1, arrNew.length-1); } }
步骤七:存储最小值并打印数组内容
将查询到的数组最小值放入新数组的第一个位置,并打印数组内容显示。代码如下所示:
import java.util.Random; import java.util.Arrays; public class MinOfArray { public static void main(String[] args) { //创建一个 10 个长度的数组 int[] arr = new int[10]; //随机生成 10 个0-99之间的数值,放入数组 Random ran = new Random(); for(int i=0;i<arr.length;i++){ arr[i] = ran.nextInt(100); } //打印数组中的数据 System.out.println("数组中的数据为:" + Arrays.toString(arr)); //查询最小值 int min = arr[0]; for(int i=1; i<arr.length; i++) { if(min > arr[i]) { min = arr[i]; } } System.out.println("最小值是:" + min); //创建新数组 int[] arrNew = new int[arr.length + 1]; //将原数组的元素拷贝进入新数组 System.arraycopy(arr, 0, arrNew, 1, arrNew.length-1); #cold_bold //最小值放入新数组第一位,并打印新数组 #cold_bold arrNew[0] = min; #cold_bold System.out.println("新数组中的数据为:" + Arrays.toString(arrNew)); } }
本案例的完整代码如下所示:
import java.util.Random; import java.util.Arrays; public class MinOfArray { public static void main(String[] args) { //创建一个 10 个长度的数组 int[] arr = new int[10]; //随机生成 10 个0-99之间的数值,放入数组 Random ran = new Random(); for(int i=0;i<arr.length;i++){ arr[i] = ran.nextInt(100); } //打印数组中的数据 System.out.println("数组中的数据为:" + Arrays.toString(arr)); //查询最小值 int min = arr[0]; for(int i=1; i<arr.length; i++) { if(min > arr[i]) { min = arr[i]; } } System.out.println("最小值是:" + min); //创建新数组 int[] arrNew = new int[arr.length + 1]; //将原数组的元素拷贝进入新数组 System.arraycopy(arr, 0, arrNew, 1, arrNew.length-1); //最小值放入新数组第一位,并打印新数组 arrNew[0] = min; System.out.println("新数组中的数据为:" + Arrays.toString(arrNew)); } }
参考答案
冒泡算法的原理如下:
在冒泡排序算法中,需要重复的走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换的元素,也就是说该数列已经排序完成。