Tradurre C++ in Java

Convertire il codice C++ in Java mantenendo la funzionalità

Puoi eseguire query direttamente su un modello e testare i risultati restituiti quando utilizzi i diversi valori dei parametri con la console Cloud o chiamando il metodo l'API Vertex AI in modo diretto.

Istruzioni di sistema

Sei un programmatore esperto di Java e C++ e ti occupi di traduzione di codice tra questi due linguaggi. Devi spiegare la procedura di conversione e assicurarti che il codice tradotto rimanga fedele all'originale, se non diversamente specificato.

Prompt in formato libero

Converti il seguente codice C++ in Java. Implementa l'equivalente della funzione isPrime di C++ utilizzando la classe BigInteger di Java per il controllo principale.

#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;
}

Risposta

Il codice C++ controlla in modo efficiente la presenza di sottostringhe prime all'interno di un numero elevato. La traduzione in Java richiede un'attenta valutazione dei tipi di dati per gestire numeri potenzialmente molto grandi. A questo scopo utilizzeremo BigInteger. Ecco l'equivalente in 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();
    }
}

Spiegazione della procedura di conversione:

  1. Intestazioni e spazi dei nomi: le direttive #include di C++ vengono sostituite con istruzioni import di Java. using namespace std; non è necessario in Java; utilizziamo esplicitamente i nomi completi (ad es. BigInteger.valueOf(2)).

  2. Tipi di dati: la modifica fondamentale è l'utilizzo di BigInteger in Java per sostituire long long. Questo ci consente di gestire numeri arbitrariamente grandi senza problemi di overflow, rispecchiando la capacità del codice C++ di elaborare input di grandi dimensioni.

  3. Funzione isPrime: la logica della funzione isPrime è in gran parte preservata. Le differenze principali sono:

    • Confronti: invece di <=, == e %, utilizziamo i metodi compareTo(), equals() e mod() della classe BigInteger.
    • Radice quadrata: utilizziamo number.sqrt() per calcolare in modo efficiente la radice quadrata per il limite superiore del loop.
  4. Manipolazione di stringhe: substr di C++ è direttamente equivalente a substring di Java.

  5. Input/output: cout e cin di C++ vengono sostituiti rispettivamente con le classi System.out.print e Scanner di Java. Ricordati di chiudere Scanner per rilasciare le risorse.

  6. Gestione degli errori: il codice Java gestisce implicitamente il potenziale NumberFormatException se la stringa di input non è un numero valido. Se necessario, si potrebbe aggiungere una gestione degli errori più solida.

Questo codice Java fornisce una soluzione funzionalmente equivalente al codice C++ specificato, gestendo grandi numeri in modo efficace utilizzando BigInteger. L'algoritmo di base rimane invariato, garantendo che la traduzione sia fedele all'intento originale.

Modello: gemini-1.5-flash-002
Temperatura: 0,2
Numero massimo di token di output: 8192
TopK: 40,0
TopP: 0,95