Aiuto caramelle

ho scritto questo codice ma come provo a eseguirlo mi da errore dicendo che ci dovrebbe essere un while a riga 44 (return risposta) e non capisco perché

#include
#include

using namespace std;

int mass(int N, vector V){
int max=V[0];
for(int i=0; i<N; i++){
if(V[i]>max){
max=V[i];
}
}

return max;

}

int solve(){
int N;
cin >> N;
vector V(N);
for(int &x: V){
cin >> x;
}

int risposta = mass(N,V);

// aggiungi codice...
int c=0;
cout << risposta;
for(int i=0; i<N; i++){
    if(risposta%V[i]){
		c++;
    }
}
while(c<N)do{
    c=0;
    risposta+=risposta;
    for(int i=0; i<N; i++){
        if(risposta%V[i]){
            c++;
        }
    }
}
return risposta;

}

int main(){
int T;
cin >> T;
for (int i = 0; i < T; i++){
cout << “Case #” << i+1 << ": " << solve() << endl;
}
}

In C/C++ esistono:

while (condizione) { /* cose */ }

e

do { /* cose */ } while (condizione);

Il compilatore ti sta dicendo che è il do che hai aperto non è chiuso da nessun while ();

ok grazie

adesso però, dopo aver corretto quell’errore, il codice non funziona lo stesso e si interrompe prima di finire perché ci dura troppo e non so cosa fare, non mi sembra molto pesante

Credo che tu entri in un loop infinito in questo punto:

while(c<N)do{
    c=0;
    risposta+=risposta;
    for(int i=0; i<N; i++){
        if(risposta%V[i]){
            c++;
        }
    }
}

Quello che fa è continuare finchè c non è maggiore o uguale a N, e c viene resettato in ogni ripetizione del while, rendendo impossibile uscire dal ciclo a meno che risposta%V[i] sia vero per ogni i

infatti dovrebbe essere così, perché sto cercando il mcm, che deve essere un numero che diviso per ogni numero della lista dia sempre resto 0. allora in realtà ho cambiato un po’ il codice perché mi sono accorta di una cosa, questa è la versione attuale:

#include
#include

using namespace std;

int mass(int N, vector V){
int max=V[0];
for(int i=0; i<N; i++){
if(V[i]>max){
max=V[i];
}
}

return max;

}

int solve(){
int N;
cin >> N;
vector V(N);
for(int &x: V){
cin >> x;
}

int risposta = mass(N,V);
int k=risposta;

// aggiungi codice...
int c=0;
for(int i=0; i<N; i++){
    if(risposta%V[i]){
		c++;
    }
}
while(c<N){
    c=0;
    risposta+=k;
    for(int i=0; i<N; i++){
        if(risposta%V[i]){
            c++;
        }
    }
}
return risposta;

}

int main(){
int T;
cin >> T;
for (int i = 0; i < T; i++){
cout << “Case #” << i+1 << ": " << solve() << endl;
}
}

praticamente io prendo il maggiore di una serie di numeri e controllo se è divisibile per tutti i numeri della serie; se non è così aggiungo al numero maggiore se stesso e ri faccio lo stesso controllo fino a che non trovo il mcm, solo che appunto non fa e non capisco il motivo. avevo pensato anche io che il problema poteva essere un loop infinito ma non capisco perché dovrebbe essere finito, penso che a un certo punto dovrebbe non essere più vera la condizione del while.

c viene resettato ogni volta, prima che riesca a superare N (c=0 all’inizio del while) e quindi non può mai superare N a meno che “if(risposta%V[i]) c++” non sia vero ogni volta, rendendo c=N (facendolo uscire dal “while(c<N)”).
Ti direi che se sposti c=0 fuori dal while non è più in un loop infinito.

Se dopo aver spostato c fuori dal while hai ancora problemi con i risultati, ti metto degli indizi che potresti utilizzare per risolvere i tuoi problemi.

Indizio piccolo: in c++ esiste la funzione lcm() (least common multiple).

Indizio grosso: Puoi utilizzare questa funzione in un ciclo per trovare il minimo comune multiplo di tutti i valori di un array.

grazie. ho fatto come mi hai detto e adesso mi da dei risultati ma sono completamente sbagliati. avevo provato a cercare se esisteva una funzione per il mcm ma non l’ho trovata, ho provato a usare quella che mi hai dato tu ma mi dice che non esiste, devo importare qualche libreria?

importa la libreria <numeric> per usare la funzione lcm()