刷题DAY24
求绝对值最大值
题目:求n个整数中的绝对值最大的数
输入:输入数据有2行,第一行为n(1<=n<=10),第二行是n个整数
输出:输出n个数中绝对值最大的数。数据保证结果唯一
输入:
5 -1 2 3 4 -5
输出:-5
import java.util.Scanner; public class 求绝对值最大值 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner reader = new Scanner(System.in); int n, i, m = 0, max = 0; n = reader.nextInt(); int a[] = new int[n]; int b[] = new int[n]; for (i = 0; i < n; i++) { a[i] = reader.nextInt(); } for (i = 0; i < n; i++) { if (a[i] > 0) { b[i] = a[i]; } else { b[i] = -a[i]; } } for (i = 0; i < n; i++) { if (b[i] > max) { max = b[i]; m = i; } } System.out.print(a[m]); } }
知识点
绝对值
在Java中,绝对值是一个数学运算符 Math.abs()
的函数,它用于返回给定数值的非负版本。无论输入的数是正还是负,Math.abs()
都会返回该数的正值。例如:
int num = -5; int absoluteValue = Math.abs(num); // 绝对值为 5
这个方法接受一个double或float类型的参数,如果传入的是整型如int、long等,它们会被隐式转换为对应的双精度浮点类型(double)。注意,Math.abs()
永远不会改变NaN(Not-a-Number)的状态。
如果你想对自定义类型(比如自定义的Number类实例)求绝对值,你可以覆盖 Object
类的 hashCode()
或者 equals()
方法,并实现相应的逻辑来计算绝对值。
NAN
简单地说,NaN是一个数字数据类型值,代表“不是数字”。NAN通常表示无效操作的结果,Java将float和double类型的NaN常量定义为Float .NaN和Double.NaN:
“ 持有类型为double的非数字(NaN)值的常量。它相当于Double.longBitsToDouble(0x7ff8000000000000L)返回的值。”
“保持float类型的非数字(NaN)值的常量。它等同于Float.intBitsToFloat(0x7fc00000)返回的值。”
我们猜一下下面的结果:
运行代码:
System.out.println("0 / 0 = " + (0 / 0));
是的,你猜对了ArithmeticException
输出结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero at com.test.BaseTest.main(BaseTest.java:25)
现在猜猜输:
运行代码
System.out.println("0.0 / 0.0 = " + (0.0 / 0.0));
0.0 / 0.0 = NaN
double和float所有的,对于Java中的其他数值数据类型,我们没有这种类型的常量。
2、NAN的校验与比较 在java中编写代码时,我们应该注意检查输入是否有效且在预期范围内。在大多数情况下,NaN值不是有效输入。因此,我们应该验证输入值不是NaN值并适当地处理这些输入值。
NaN无法与任何浮动类型值进行比较。这意味着我们会得到虚假的涉及所有的比较操作的NaN(除“!=”为此我们得到真正的)。
测试代码如下
float Nan = Float.NaN; System.out.println("(NaN == 1) = "+(Nan == 1)); System.out.println("(Nan > 1) = "+(Nan > 1)); System.out.println("(Nan < 1) = " + (Nan < 1)); System.out.println("(NaN != 1) = " + (Nan != 1)); System.out.println("(NaN == NaN) = " + (Nan == Nan)); System.out.println("(NaN > NaN) = " + (Nan > Nan)); System.out.println("(NaN < NaN) = " + (Nan < Nan)); System.out.println("(NaN != NaN) = " + (Nan != Nan));
得到结果如下;
(NaN == 1) = false (Nan > 1) = false (Nan < 1) = false (NaN != 1) = true (NaN == NaN) = false (NaN > NaN) = false (NaN < NaN) = false (NaN != NaN) = true
在我们的代码中校验是否为NAN值,我们可以使用:Float.isNaN和Double.isNaN方法来检查这些值,这种方法易读易懂。
NaN:非数值类型;Infinite:无穷大(包含正无穷大、负无穷大);
素数判断
题目:对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<=y<=50),判定该表达式的值是否都为素数
输入:输入数据有多组,每组占一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理
输出:对于每个给定范围内的取值,如果表达式的值都为素数,则输出"OK",否则请输出“Sorry”,每组输出占一行
输入:
0 1 0 0
输出:
OK
import java.util.Scanner; public class 素数判断 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int x = scanner.nextInt(); int y = scanner.nextInt(); if (x == 0 && y == 0) { break; // 输入结束标志 } if (x > y) { int temp = x; x = y; y = temp; // 确保x是范围的最小值 } boolean allPrimes = true; for (int n = x; n <= y; n++) { int result = n * n + n + 41; // 计算表达式的值 if (!isPrime(result)) { // 如果结果不是素数,则标记为非素数范围并退出循环 allPrimes = false; break; } } if (allPrimes) { System.out.println("OK"); // 如果所有结果都是素数,则输出OK } else { System.out.println("Sorry"); // 如果有任何一个结果不是素数,则输出Sorry } } scanner.close(); // 关闭扫描器以释放资源 } // 辅助方法:检查一个数是否为素数(试除法实现) private static boolean isPrime(int number) { if (number <= 1) { // 小于等于1的数不是素数(根据数学定义) return false; } for (int i = 2; i <= Math.sqrt(number); i++) { // 试除法检查从2到该数的平方根的所有整数是否能整除该数(优化计算) if (number % i == 0) { // 如果找到能整除该数的数,则该数不是素数(根据素数的定义) return false; // 直接返回false并退出循环(因为已经找到一个非1和非该数的因数) } } return true; // 如果没有找到能整除该数的数(除了1和该数本身),则该数是素数(根据素数的定义)并返回true表示是素数。 } }
知识点
素数
除了1 和它本身以外,不能被任何整数整除的数例如:17,它不能被 2~16 的任一整数整除,因此17为素数。
想法:
-
判断一个整数m是否是素数,只需判断[2,m-1]之间是否存在能将m整除的整数,如果都不能被整除,那么 m 就是一个素数
-
在1的基础上,进一步思考:实现该判断,m是否是素数,只需判断m能否被[2, m/2]区间的整数整除即可。虽然过程没差别,但是可以提高程序的运行效率。例如:整数36,只需判断[2, 18]区间内是否存在整数将36整除,(18,36]区间内,不存在能将36整除的整数,因此不需要多此一举进行判断
-
如果一个数不是素数且不等于1,那么它的最小质因数小于等于他的平方根。判断的流程与思路一没有什么差别因此,只需判断m能否被2~√(m)区间内的整数整除即可。例如:整数35,√(35)≈5.92,而35能被2~5.92之间的整数5整除,因此35不是素数