Zeri di coda aiuto in input

Ciao ragazzi,
Ho provato a sviluppare l’algoritmo di risoluzione del problema “zeri di coda” che, in una buona parte funziona.
Vorrei un vostro aiuto nel trasformare quei caratteri della stringa di input in dei numeri da moltiplicare per poi risolvere il problema.

Ciao, allora potresti leggere la stringa di caratteri e poi sostituire tutti i caratteri ‘x’ con degli spazi (’ '), dopodiché leggere i vari numeri usando in modo appropriato la funzione sscanf(…) che funziona in modo simile a scanf(…) ma legge i caratteri scritti su un const char*.
L’idea è di eseguire il prodotto dei vari numeri è matematicamente valida ma a meno che tu non disponga di un tipo numero intero a precisione infinita (sempre che si dica così) l’overflow è assicurato, quindi l’ideale sarebbe cercare un diverso approccio.
Spero di esserti stato utile.

Pensala così: una stringa non è altro che un array di char. Se consulti la ASCII table noterai che, ad esempio, allo 0 è associato il 48, all’1 il 49 e così via. Per convertire la stringa in un intero basterà tenersi una variabile che ogni volta moltiplichi per 10 (in modo da scandire unità, decine, centinaia, ecc) e moltiplicarla per le “cifre” della stringa corrispondenti a unità, decine, centinaia, ecc…

Ad esempio: voglio convertire la stringa “138” in intero.
Per cui diventerà: (‘8’ - 48) * 1 + (‘3’ - 48) * 10 + (‘1’ - 48) * 100

Un’idea per convertire una stringa in c (char []) in numero è quella di utilizzare la funzione atoi. A questo punto devi costruirti un algoritmo che ti divida la stringa nei numeri da moltiplicare.

Soluzione:

(la funzione scritta sotto serve per il calcolo del numero, non per trovare gli zero richiesti dal problema)

long long int moltiplicazione(char stringa[])
{
	long long int totale = 1;
	
	int inizio, fine;
	
	// avvio un for per dividere la stringa
	for(fine = 0; fine < strlen(stringa); fine++)
	{
		// imposto l'inizio del numero attuale alla fine del numero precedente
		inizio = fine;

		//  trovo la fine o alla 'x' successiva al numero
		for(fine = inizio; stringa[fine] != '\0' && stringa[fine] != 'x'; fine++);
	
		// assegno al numero le singole cifre del numero
		char numero[9];
		for(int i = inizio; i < fine; i++)
			numero[i - inizio] = stringa[i];
		numero[fine] = '\0';	// mi ricordo di mettere il terminatore
		
		// e poi attraverso la funzione atoi calcolo il totale
		totale *= atoi(numero);
	}
	
	return totale;
}

Con questa soluzione non funziona proprio. Ma modificandola quasi tutta ottengo solo 30/100

In effetti ho scritto il codice ma non ho controllato se funzionava o meno. Ho visto che c’è un’errore. L’errore si trova quando inserisco il terminatore nel numero:
numero[fine] = '\0'; ===> numero[fine-inizio] = '\0';

L’errore riguarda l’utilizzo di interi per eseguire la moltiplicazione. Provando con il secondo esempio il programma darebbe come risultato (utilizzando unsigned long long int)…

6289704748344333312

… mentre la soluzione alla moltiplicazione è…

3345205033626060135823953024000

Questa è la mia soluzione data una stringa in input (poi la dovrai adattare al programma ;)):


long long int num=0;
int d=1;
for(int i=strlen(stringa)-1; i>=0; i–){
num+=(stringa[i]-48)d;
d
=10;
}

La soluzione al problema sarebbe quella di eseguire la fattorizzazione dei singoli numeri (50 = 2*5*5) e contare semplicemente quanti 2 e 5 sono presenti nelle singole fattorizzazioni.
Nell’ esempio precedente l’algoritmo dovrebbe contare una volta il 2 e due volte il 5. Dopo di che per sapere quanti 0 sono presenti alla fine del codice, dovrai conoscere il numero di 10 moltiplicati nella fattorizzazioni.

Questo perchè moltiplicando un numero per 10 o per un suo multiplo il risultato avrà uno 0 alla fine del numero.

Per spiegarmi meglio riprendo l’esempio di prima dicendoti che in quel caso si formerà soltanto un 10 nella fattorizzazione. Quindi 50 risulterà anche 10 * 5. Per farla breve devi vedere “quanti 2 e 5 sono in comune”.
Nell’esempio…
17264x72635x928x7x61537x8347x95475x8374
…ho calcolato, facendo la scomposizione, 10 volte il 2 e 3 volte il 5 e con quanto ho detto prima il risultato sarà 3.