[Algoritmo diario pequeño (setenta y cinco)] [Número primo] El número primo vecino más cercano

Prefacio:
Hoy participé en el examen escrito de una compañía sobre números primos, así que publíquelo aquí.

Descripción del título

Ingrese una matriz entera positiva arr [] de tamaño n. Cada elemento a de arr [] tiene un rango de valores de 1 <= a <= 100000. Encuentre el número primo más cercano adyacente a cada elemento y devuélvalo como una nueva matriz. Diseñe un algoritmo con mayor complejidad temporal y analice la complejidad temporal y espacial.
Entrada:
5
1
2
3
8
10
Salida:
2
2
3
7
11

Ideas para resolver problemas

Esta pregunta, no pensé en la solución óptima. Completamente usando el método de fuerza bruta. Encuentra números primos en ambos lados del entero de entrada. En otras palabras, use dos punteros para mirar a ambos lados. El primero encontrado es el número primo más cercano. De todos modos, este es el método más violento. No esperaba lo mejor. Lo publiqué aquí. Si a un gran dios se le ocurriera lo mejor, podría publicarlo aquí. Aprendan unos de otros.

Muestra de código

package AiStudy;


import java.util.ArrayList;
import java.util.Scanner;

/**
 * @note 最近邻素数
 * 输入大小n的正整数数组arr[],arr[]的每个元素a取值范围为:1<=a<=100000,
 * 找到与每个元素相邻最近的一个素数并作为新的数组返回。请设计时间复杂度较优的算法,并给出时间与空间复杂度分析。
 * <p>
 * 第一行输入n,表示需要输入n个正整数,
 * 然后输入n个正整数a,1<=a<=100000
 * <p>
 * 对于每组测试数据,输出n行最近邻的素数,行末无多余空格
 */
public class Main {

    private static int makeNearestPrime(int a) {
        if(a<=2)
        {
            return 2;
        }
        if(a==3)
        {
            return 3;
        }
        int left = 0;
        int right = 0;
        int j;
        int i;
        for ( i = 1; i <a-2 ; i++) {
            for ( j= 2; j <= Math.sqrt(a+i); j++) {
                if((a+i)%j==0)
                {
                    break;
                }
            }
            if(j>Math.sqrt(a+i))
            {
                left=1;
            }
            for (j=2; j <=Math.sqrt(a-i) ; j++) {
                if((a-i)%j==0)
                {
                    break;
                }
            }
            if(j>Math.sqrt(a-i))
            {
                right=1;
            }
            if(left==1||right==1)
            {
                break;
            }
        }
        if(left==1)
        {
            return a+i;
        }else {
            return a-i;
        }

    }
    public static ArrayList<Integer> list = new ArrayList<Integer>();
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int n = in.nextInt();
            int len = n;
            while (n-- > 0) {
                int a = in.nextInt();
                // 求最近素数
                int res = makeNearestPrime(a);
                list.add(res);
            }
            for (int i = 0; i < len; i++) {
                System.out.println(list.get(i));
            }
        }
    }
}
197 artículos originales publicados · elogiados 73 · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_39397165/article/details/104620230
Recomendado
Clasificación