Cómo traducir C++ a Java

Convierte código C++ a Java y conserva la funcionalidad

Puedes consultar un modelo directamente y probar los resultados que se muestran cuando usas valores de parámetros diferentes con la consola de Cloud o con una llamada directa a la API de Vertex AI.

Instrucciones del sistema

Eres un programador con conocimientos en Java y C++, que se enfoca en la traducción de código entre estos dos lenguajes. Explicas tu proceso de conversión y te aseguras de que el código traducido sea fiel al original, a menos que se especifique lo contrario.

Mensaje Freeform

Convierte el siguiente código C++ a Java. Implementa el equivalente de la función isPrime de C++ con la clase BigInteger de Java para la verificación de números primos.

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

bool isPrime(long long number) {
  if (number <= 1) return false;
  if (number == 2) return true;
  if (number % 2 == 0) return false;
  for (long long i = 3; i <= sqrt(number); i += 2) {
    if (number % i == 0) return false;
  }
  return true;
}

int main() {
  string largeNumber;
  cout << "Enter a large number: ";
  cin >> largeNumber;

  int primeSubstringCount = 0;

  for (size_t i = 0; i < largeNumber.length(); ++i) {
    for (size_t j = i + 1; j <= largeNumber.length(); ++j) {
      string substring = largeNumber.substr(i, j - i);
      long long number = stoll(substring);

      if (isPrime(number)) {
        primeSubstringCount++;
        cout << "Prime substring: " << substring << endl;
      }
    }
  }

  cout << "Total number of prime substrings: " << primeSubstringCount << endl;

  return 0;
}

Respuesta

El código C++ busca subcadenas primos de manera eficiente dentro de un número grande. Para traducir esto a Java, se debe considerar cuidadosamente los tipos de datos para manejar números potencialmente muy grandes. Para ello, usaremos BigInteger. Este es el equivalente en Java:

import java.math.BigInteger;
import java.util.Scanner;

public class PrimeSubstrings {

    public static boolean isPrime(BigInteger number) {
        if (number.compareTo(BigInteger.ONE) <= 0) return false;
        if (number.equals(BigInteger.valueOf(2))) return true;
        if (number.mod(BigInteger.valueOf(2)).equals(BigInteger.ZERO)) return false;
        for (BigInteger i = BigInteger.valueOf(3); i.compareTo(number.sqrt()) <= 0; i = i.add(BigInteger.valueOf(2))) {
            if (number.mod(i).equals(BigInteger.ZERO)) return false;
        }
        return true;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter a large number: ");
        String largeNumber = scanner.nextLine();

        int primeSubstringCount = 0;

        for (int i = 0; i < largeNumber.length(); ++i) {
            for (int j = i + 1; j <= largeNumber.length(); ++j) {
                String substring = largeNumber.substring(i, j);
                BigInteger number = new BigInteger(substring);

                if (isPrime(number)) {
                    primeSubstringCount++;
                    System.out.println("Prime substring: " << substring);
                }
            }
        }

        System.out.println("Total number of prime substrings: " + primeSubstringCount);
        scanner.close();
    }
}

Explicación del proceso de conversión:

  1. Encabezados y espacios de nombres: Las directivas #include de C++ se reemplazan por sentencias import de Java. No se necesita using namespace std; en Java. Usamos de forma explícita los nombres completamente calificados (p. ej., BigInteger.valueOf(2)).

  2. Tipos de datos: El cambio fundamental es usar BigInteger en Java para reemplazar long long. Esto nos permite controlar números arbitrariamente grandes sin problemas de desbordamiento, lo que refleja la capacidad del código C++ para procesar entradas grandes.

  3. Función isPrime: La lógica de la función isPrime se conserva en gran medida. Las diferencias clave son las siguientes:

    • Comparaciones: En lugar de <=, == y %, usamos los métodos compareTo(), equals() y mod() de la clase BigInteger.
    • Raíz cuadrada: Usamos number.sqrt() para calcular de manera eficiente la raíz cuadrada del límite superior del bucle.
  4. Manipulación de cadenas: substr de C++ es directamente equivalente a substring de Java.

  5. Entrada/salida: cout y cin de C++ se reemplazan por la clase System.out.print y Scanner de Java, respectivamente. Recuerda cerrar Scanner para liberar recursos.

  6. Manejo de errores: El código Java controla de forma implícita posibles NumberFormatException si la cadena de entrada no es un número válido. Si es necesario, se podría agregar un manejo de errores más sólido.

Este código Java proporciona una solución funcionalmente equivalente al código C++ determinado y controla grandes números de manera eficaz con BigInteger. El algoritmo principal no se modifica, lo que garantiza que la traducción sea fiel al intent original.

Modelo: gemini-1.5-flash-002
Temperatura: 0.2
Cantidad máxima de tokens de salida: 8192
TopK: 40.0
TopP: 0.95