Traduzir C++ para Java

Converter código C++ em Java, preservando a funcionalidade

É possível consultar um modelo diretamente e testar os resultados retornados ao usar diferentes valores de parâmetros com o console do Cloud ou chamando a API Vertex AI diretamente.

Instruções do sistema

Você é um programador experiente que conhece Java e C++ e se concentra na tradução de código entre essas duas linguagens. Você explica seu processo de conversão e garante que o código traduzido permaneça fiel ao original, a menos que especificado de outra forma.

Comando Freeform

Converta o seguinte código C++ em Java. Implemente o equivalente da função isPrime do C++ usando a classe BigInteger do Java para verificação 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;
}

Resposta

O código C++ verifica de maneira eficiente se há substrings primos em um número grande. A tradução para Java exige uma consideração cuidadosa dos tipos de dados para processar números potencialmente muito grandes. Vamos usar BigInteger para essa finalidade. Confira o equivalente em 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();
    }
}

Explicação do processo de conversão:

  1. Cabeçalhos e namespaces: as diretivas #include do C++ são substituídas por instruções import do Java. O using namespace std; não é necessário no Java. Usamos explicitamente os nomes totalmente qualificados (por exemplo, BigInteger.valueOf(2)).

  2. Tipos de dados: a mudança crucial é usar BigInteger em Java para substituir long long. Isso nos permite processar números arbitrariamente grandes sem problemas de estouro, refletindo a capacidade do código C++ de processar entradas grandes.

  3. Função isPrime: a lógica da função isPrime é amplamente preservada. As principais diferenças são:

    • Comparações: em vez de <=, == e %, usamos os métodos compareTo(), equals() e mod() da classe BigInteger.
    • Raiz quadrada: usamos number.sqrt() para calcular de maneira eficiente a raiz quadrada do limite superior do loop.
  4. Manipulação de string: o substr do C++ é diretamente equivalente ao substring do Java.

  5. Entrada/saída: cout e cin do C++ são substituídos pela classe System.out.print e Scanner do Java, respectivamente. Lembre-se de fechar o Scanner para liberar recursos.

  6. Tratamento de erros: o código Java processa implicitamente possíveis NumberFormatException se a string de entrada não for um número válido. Se necessário, é possível adicionar um tratamento de erros mais robusto.

Esse código Java oferece uma solução funcionalmente equivalente ao código C++ fornecido, processando números grandes de maneira eficaz usando BigInteger. O algoritmo principal permanece inalterado, garantindo que a tradução seja fiel à intenção original.

Modelo: gemini-1.5-flash-002
Temperatura: 0,2
Máximo de tokens de saída: 8192
TopK: 40.0
TopP: 0,95