刷题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为素数。

想法:

  1. 判断一个整数m是否是素数,只需判断[2,m-1]之间是否存在能将m整除的整数,如果都不能被整除,那么 m 就是一个素数

  2. 在1的基础上,进一步思考:实现该判断,m是否是素数,只需判断m能否被[2, m/2]区间的整数整除即可。虽然过程没差别,但是可以提高程序的运行效率。例如:整数36,只需判断[2, 18]区间内是否存在整数将36整除,(18,36]区间内,不存在能将36整除的整数,因此不需要多此一举进行判断

  3. 如果一个数不是素数且不等于1,那么它的最小质因数小于等于他的平方根。判断的流程与思路一没有什么差别因此,只需判断m能否被2~√(m)区间内的整数整除即可。例如:整数35,√(35)≈5.92,而35能被2~5.92之间的整数5整除,因此35不是素数

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值