ESERCIZIO C++

di il
9 risposte

ESERCIZIO C++

Salve a tutti ragazzi, sono al primo anno di informatica e devo svolgere questo esercizio per esercitarmi prima dell'esonero di fondamenti ma purtroppo non riesco ha trovare nessuna soluzione, vorrei che qualcuno mi aiutase a trovare un modo per svolgere l'esercizio.
Questa è la traccia:

Sia data in input una sequenza di interi terminata da 0, rappresentante degli ostacoli situati su un percorso in linea retta. Si suppone di voler saltare, a partire dalla coordinata 0 lungo tale percorso con salti di uguale lunghezza ed evitando tutti gli ostacoli. Trovare e stampare il salto di lunghezza minima che permette di evitare tutti gli ostacoli.Si supponga che non ci siano più di 20 ostacoli, di dover considerare salti lunghi al più 20 e che vi sia sempre un salto di lunghezza compresa tra 1 e 20 che permette di evitare tutti gli ostacoli.

Esempio:
Input:7 9 5 3 6 0
Output:4

Spiegazione:Il salto di lunghezza minima che permette di evitare tutti gli ostacoli è 4. Infatti non ci sono ostacoli nelle posizioni 4, 8, 12 e così via. I salti di lunghezza più corti di 4invece non vanno bene: saltando con lunghezza 1 cadremmo su tutti gli ostacoli, con salti di lunghezza 2 cadremmo sull’ostacolo in posizione 6, mentre con salti di lunghezza 3 cadremmo sugli ostacoli 3, 6 e 9

9 Risposte

  • Re: ESERCIZIO C++

    Qui non si fanno gli esercizi al posto tuo. Leggi il regolamento.
  • Re: ESERCIZIO C++

    oregon ha scritto:


    Qui non si fanno gli esercizi al posto tuo. Leggi il regolamento.
    Non ho chiesto di svolgere l'esercizio al posto mio, ho chiesto un idea o una spiegazione visto che non mi viene in mente cosa fare per risolverlo.
  • Re: ESERCIZIO C++

    Ti butto un'idea, probabilmente ce ne sono di meno impacciate ma credo funzioni. La condizione affinchè il numero n che cerchi passi per uno di quegli ostacoli è che sia divisibile per quest'ultimo. Ad esempio se scegli 2 e nel percorso c'è un 4 certamente ci finirai dentro perchè 4%2=0. Di conseguenza potresti partire da 1 e fare un confronto tra il valore n e tutti gli elementi del percorso. Se anche solo un ostacolo è divisibile per n lo incrementi di 1, fino a trovare quel valore non divisibile per nessuno di questi.
  • Re: ESERCIZIO C++

    Supponendo che almeno un ostacolo ci sia sempre, è inutile partire da 1.
  • Re: ESERCIZIO C++

    piontek77 ha scritto:


    oregon ha scritto:


    Qui non si fanno gli esercizi al posto tuo. Leggi il regolamento.
    Non ho chiesto di svolgere l'esercizio al posto mio, ho chiesto un idea o una spiegazione visto che non mi viene in mente cosa fare per risolverlo.
    Allora non lasciare solamente la traccia ma discuti di quello che faresti tu. E' impossibile non avere neanche un'idea di come cominciare un esercizio.

    Ad esempio, comincia a scrivere e postare questa parte (senza impostare alcun criterio per ora)

    "Sia data in input una sequenza di interi terminata da 0"

    Penso tu sappia farla.
  • Re: ESERCIZIO C++

    enricoscarsissimo ha scritto:


    Ti butto un'idea, probabilmente ce ne sono di meno impacciate ma credo funzioni. La condizione affinchè il numero n che cerchi passi per uno di quegli ostacoli è che sia divisibile per quest'ultimo. Ad esempio se scegli 2 e nel percorso c'è un 4 certamente ci finirai dentro perchè 4%2=0. Di conseguenza potresti partire da 1 e fare un confronto tra il valore n e tutti gli elementi del percorso. Se anche solo un ostacolo è divisibile per n lo incrementi di 1, fino a trovare quel valore non divisibile per nessuno di questi.
    Mi dispiace ma non ho capito la tua idea, vorrei trovare una soluzione più semplice, io avevo iniziato in questo modo
    così ho una retta di 20 elementi in cui gli ostacoli sono rappresentati dal numero 1, poi ho un blocco.
    
    #include <iostream>
    using namespace std;
    int main()
    {	
    	int array[21]{0};
    	int x;
    
    
    	cin>>x;
    		
    	while(x!=0)
    	{
    		array[x]=1;
    		cin>>x;
    	}
    
    	for(i=1; i<21; i++)
    	{
    		
    
    	}
    
    
    
    	
    
    
    
    	return 0;
    }
    
    
    
    
    
    
    
    
  • Re: ESERCIZIO C++

    Verificato: il meccanismo suggerito da enricoscarsissimo funziona.
  • Re: ESERCIZIO C++

    Ti consiglio di salvare in un vettore direttamente i valori che ti vengono passati da stdin e di usare lo zero per terminare il salvataggio dei valori. Dopo che li salvi controlli che il numero (che inizia da 2 e si incrementa ad ogni giro se non è quello che cerchi) non sia divisibile per tutti i valori contenuti nel vettore stesso. Se è divisibile per uno di essi incrementi di uno e ricominci a controllare dal primo elemento del vettore, altrimenti hai trovato quello che cercavi.
    Comunque quando dicevo soluzione più semplice intendevo che forse non serve controllare tutte le volte ogni singolo valore ma si può trovare una condizione unica per garantire la non divisibilità (tipo un mcd ma al contrario per intenderci)
  • Re: ESERCIZIO C++

    enricoscarsissimo ha scritto:


    Ti consiglio di salvare in un vettore direttamente i valori che ti vengono passati da stdin e di usare lo zero per terminare il salvataggio dei valori. Dopo che li salvi controlli che il numero (che inizia da 2 e si incrementa ad ogni giro se non è quello che cerchi) non sia divisibile per tutti i valori contenuti nel vettore stesso. Se è divisibile per uno di essi incrementi di uno e ricominci a controllare dal primo elemento del vettore, altrimenti hai trovato quello che cercavi.
    Comunque quando dicevo soluzione più semplice intendevo che forse non serve controllare tutte le volte ogni singolo valore ma si può trovare una condizione unica per garantire la non divisibilità (tipo un mcd ma al contrario per intenderci)
    Grazie mille, ho provato a sviluppare la tua idea e il programma funziona perfettamente, allego il codice se vuoi controllare.
    Buona giornata.
    
    #include <iostream>
    using namespace std;
    int main()
    {	
    	int array[1000]{0};
    	int x;
    	int cont=0;
    	int salto=2;
    
    
    	for(int i=0; i<1000; i++)
    	{
    
    		cin>>x;
    
    		if (x==0 && i==0)
    		{
    			cout<<"1";
    			return 0;
    		}
    
    		if (x!=0)
    		{
    			array[cont]=x;
    			cont++;
    		}
    		else
    			break;
    
    	}
    
    
    	for(int i=0; i<20; i++)
    	{
    		for(int j=0; j<cont; j++)
    		{
    			if(array[j]%salto==0)
    			{
    				salto++;
    				break;
    			}
    		}
    
    	}
    
    	cout<<salto;
    
    	
    
    
    
    	return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
9 risposte