Algoritmo che genera tutti i numeri possibili formati da 4 cifre

di il
40 risposte

Algoritmo che genera tutti i numeri possibili formati da 4 cifre

Salve, ho realizzato questo algoritmo che genera tutti i numeri possibili a 4 cifre.
Il programma restituisce correttamente i numeri per una ventina di volte, poi sbaglia e restituisce numeri totalmente random.
Quale può essere l'errore?
#include <stdio.h>
#include <stdlib.h>
#define LUN 4

int power(int base, int exponent);
//algoritmo che genera tutti i numeri possibili formati da 4 cifre
int main(void){
	int Vett[] = {0,1,2,3,4,5,6,7,8,9};
	int i;
	int t;
	int max = power(10,4); //power = 10000
	int bVett[LUN];

	//printf("power is %d\n",max);

	for(i=0; i<max; i++){
		t = i % 10;
		bVett[0] = Vett[t];

		t = (int)i/2;
		bVett[1] = Vett[t];

		t = (int)i/4;
		bVett[2] = Vett[t];

		t = (int)i/8;
		bVett[3] = Vett[t];

		printf("%d%d%d%d\n",bVett[3],bVett[2],bVett[1],bVett[0]);
	}

	system("pause");
	return 0;
}

int power(int base, int exponent)
{
  int i, s=1;
  for (i = 0; i < exponent; ++i)
    s *= base;
  return s;
}
Un esempio di output dovrebbe essere questo:
0000                                                                                                                                                                        
0001                                                                                                                                                                        
0012                                                                                                                                                                        
0013                                                                                                                                                                        
0124                                                                                                                                                                        
0125                                                                                                                                                                        
0136                                                                                                                                                                        
0137                                                                                                                                                                        
1248 
1249                                                                                                                                                                        
1250                                                                                                                                                                        
1251                                                                                                                                                                        
1362                                                                                                                                                                        
1363
.
.
.
.
9999

40 Risposte

  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Prendi ad esempio
    
    t = (int)i/2;
    bVett[1] = Vett[t];
    
    Per tutti i valori di i a partire da 20...
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Due righe...
    
        for(i = 0; i < 10000; i++)
            printf("%04d\n", i);
    
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Per ottenere tutti i numeri possibili a 4 cifre, bisogna fare un ciclo for che va da 0 a 9999
    Il tuo è sicuramente un esercizio, e l'errore sta nel fatto che non hai considerato che quando la i del for supera il 20,40,80 genera t maggi di 10 dove hai i/2, i/4, i/8.
    ho aggiunto %10, per far ripartire il ciclo, ma devi ancora lavorare per far funzionare il codice, perché così, vai bene solo per 80 combinazioni.
    
    #include <stdio.h>
    #include <stdlib.h>
    #define LUN 4
    
    int power(int base, int exponent);
    //algoritmo che genera tutti i numeri possibili formati da 4 cifre
    int main(void){
    	int Vett[] = {0,1,2,3,4,5,6,7,8,9};
    	int i;
    	int t;
    	int max = power(10,4); //power = 10000
    	int bVett[LUN];
    
    	//printf("power is %d\n",max);
    
    	// attenzione ho messo 80 invece di max
    	for(i=0; i<80; i++){
    		t = i % 10;
    		bVett[0] = Vett[t];
    
    		t = (int)i/2 % 10;
    		bVett[1] = Vett[t];
    
    		t = (int)i/4 % 10;
    		bVett[2] = Vett[t];
    
    		t = (int)i/8 % 10;
    		bVett[3] = Vett[t];
    
    		printf("%d%d%d%d\n",bVett[3],bVett[2],bVett[1],bVett[0]);
    	}
    
    	system("pause");
    	return 0;
    }
    
    int power(int base, int exponent)
    {
      int i, s=1;
      for (i = 0; i < exponent; ++i)
        s *= base;
      return s;
    }
    
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Ok grazie.
    Weierstrass hai ragione, però questo esercizio potrebbe avere in input anche delle lettere oltre a numeri e in tal caso non si può contare.
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Così è corretto...
    
    #include <stdio.h>
    #include <stdlib.h>
    #define LUN 4
    
    int power(int base, int exponent);
    //algoritmo che genera tutti i numeri possibili formati da 4 cifre
    int main(void){
    	int Vett[] = {0,1,2,3,4,5,6,7,8,9};
    	int i;
    	int t;
    	int max = power(10,4); //power = 10000
    	int bVett[LUN];
     
    	//printf("power is %d\n",max);
    
    	for(i=0; i<max; i++){
    		t = i % 10;
    		bVett[0] = Vett[t];
    
    		t = (int)i/10 % 10;
    		bVett[1] = Vett[t];
    
    		t = (int)i/100 % 10;
    		bVett[2] = Vett[t];
    
    		t = (int)i/1000 % 10;
    		bVett[3] = Vett[t];
    
    		printf("%d%d%d%d\n",bVett[3],bVett[2],bVett[1],bVett[0]);
    	}
    
    	system("pause");
    	return 0;
    }
    
    int power(int base, int exponent)
    {
      int i, s=1;
      for (i = 0; i < exponent; ++i)
        s *= base;
      return s;
    }
    
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Ok ora funziona, però c'è un problema con il terminale, ovvero ci dovrebbe essere un limite di tot righe stampabili, dopo queste tot righe sovrascrive le righe eliminando quindi i valori predenti. Riesco a visualizzare solo i numeri che vanno da 1000 a 9999.
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Comunque è una soluzione alla carlona anche con le lettere. Il pow addirittura!
    
    #include<stdio.h>
    int main(){
        char Vett[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        int i, j, k, l, s = sizeof(Vett);
        for(i = 0; i < s; i++)
            for(j = 0; j < s; j++)
                for(k = 0; k < s; k++)
                    for(l = 0; l < s; l++)
                        printf("%c%c%c%c\n", Vett[i], Vett[j], Vett[k], Vett[l]);    
        return 0;
    }
    
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Stampa su file
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Il buffer della console non è infinito, lo puoi modificare o salvare il risultato su testo così:
    
    #include <stdio.h>
    #include <stdlib.h>
    #define LUN 4
    
    int power(int base, int exponent);
    //algoritmo che genera tutti i numeri possibili formati da 4 cifre
    int main(void){
    	int Vett[] = {0,1,2,3,4,5,6,7,8,9};
    	int i;
    	int t;
    	int max = power(10,4); //power = 10000
    	int bVett[LUN];
    
    	FILE *pFile;
    	pFile=fopen("Numeri.txt", "wt");
    
    	for(i=0; i<max; i++){
    		t = i % 10;
    		bVett[0] = Vett[t];
    
    		t = (int)i/10 % 10;
    		bVett[1] = Vett[t];
    
    		t = (int)i/100 % 10;
    		bVett[2] = Vett[t];
    
    		t = (int)i/1000 % 10;
    		bVett[3] = Vett[t];
    
    		printf("%d%d%d%d\n",bVett[3],bVett[2],bVett[1],bVett[0]);
    
    		fprintf(pFile,"%d%d%d%d\n",bVett[3],bVett[2],bVett[1],bVett[0]);
    	}
    	fclose(pFile);
    	system("pause");
    	return 0;
    }
    
    Ho corretto il tuo codice perché mi sto un po' divertendo con il C, gli interventi di Weierstrass sono molto più circostanziati dei miei.
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Se nel titolo scrivi "numeri formati da 4 cifre" allora le lettere non sono consentite.
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Spark ha scritto:


    Ok grazie.
    Weierstrass hai ragione, però questo esercizio potrebbe avere in input anche delle lettere oltre a numeri e in tal caso non si può contare.
    Visto che una soluzione è già stata data, posto la mia, anche se non si dovrebbe dare "la pappa pronta" . È di tipo ricorsivo e vale anche con altri tipi di dato, a meno di qualche aggiustamento.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX 100
    void _permutations(int n, int k, int max_k, int v[], int output[])
    {
        int i;
        if(k < max_k)
        {
            for(i=0;i<n;i++)
            {
                output[k] = v[i];
                _permutations(n, k+1, max_k, v, output);
            }
            return;
        }
        else
        {
            for(i=0;i<max_k;i++)
                 printf("%d",output[i]);
            printf("\n");
        }
    }
    void permutations(int n, int k, int v[])
    {
        int output[MAX];
        if(k > n || k > MAX) return;
        _permutations(n, 0 ,k, v, output);
        return;
    }
    int main()
    {
        int n=10;
        int k=4;
        int v[10] = {0,1,2,3,4,5,6,7,8,9};
        permutations(n, k, v);
        
        return 0;
    }
    
    I valori n e k potrebbero essere inseriti da tastiera e caricare v da tastiera. Al variare di k cambia il numero di elementi di ogni output.
    Se vuoi cambiare il tipo di dato, basta cambiare il tipo dei vettori "v" e "output", oltre ad aggiustare la printf in _permutations. In C++ si potrebbe fare con dei template.
    Non so se conosci l'allocazione dinamica dei vettori, in tal caso non servirebbe una costante MAX per il vettore "output" all'interno di "permutations". Si potrebbe allocare dinamicamente con la dimensione del k.
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Grazie alexv.
    Ho modificato la mia soluzione in modo da poter decidere anche il numero dei caratteri (LUN).
    Mi chiedevo se fosse possibile farlo anche con la soluzione di weirstrass che ad occhio mi sembra la più semplice.
    #include <stdio.h>
    #include <stdlib.h>
    #define LUN 5
    
    int power(int, int);
    int main(void){
    	char Vett[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    	int i;
    	int t;
    	int j;
    	int max = power(sizeof(Vett),LUN);
    	char bVett[LUN];
    
    	//printf("power is %d\n",max);
    
    	for(i=0; i<max; i++){
    		t = i % sizeof(Vett);
    		bVett[j=0] = Vett[t];
    		printf("%c",bVett[j]);
    		for (j=1; j<LUN; j++){
    			t = (int)i/power(sizeof(Vett),j) % sizeof(Vett);
    			bVett[j] = Vett[t];
    			printf("%c",bVett[j]);
    		}
    		printf("\n");
    	}
    
    	system("pause");
    	return 0;
    }
    
    int power(int base, int exponent)
    {
      int i, s=1;
      for (i = 0; i < exponent; ++i)
        s *= base;
      return s;
    }
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Spark ha scritto:


    Grazie alexv.
    Ho modificato la mia soluzione in modo da poter decidere anche il numero dei caratteri (LUN).
    Mi chiedevo se fosse possibile farlo anche con la soluzione di weirstrass che ad occhio mi sembra la più semplice.
    Sentiamo Weirstrass, si dovrebbe fare con la ricorsione, una funzione con un solo ciclo for che richiama sestessa, tante volte quante sono le cifre.
    Il codice seguente, funziona con LEN tra 1 e 5, il numero di elementi di Vett può essere arbitrario.
    Salva su un file di nome Numeri.txt, e mostra le iterazioni, comodo per controllare l'esattezza del codice.
    
    #include <stdio.h>
    #include <stdlib.h>
    #define LUN 4 // per usare LUN > 5 bisogna modificare il codice
    
    int power(int base, int exponent);
    //algoritmo che genera tutti le combinazioni possibili formati da LUN caratteri
    int main(void){
    	// cambiando il numero di elemnti del vettore Vett, il programma si adegua
    	char Vett[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
    	int i,t,n=0, s = sizeof(Vett);
    	int mass = power(s,LUN); // potenza
    	int bVett[LUN];
    
        FILE *pFile;
    
        if((pFile=fopen("Numeri.txt", "wt"))==NULL){
            printf("Errore nell'apertura del file'");
            exit(1);
    	}
    
    	for(i=0; i<mass; i++){
            t = i % s;
            bVett[0] = Vett[t];
    
            t = (int)i/(s) % s;
            bVett[1] = Vett[t];
    
            t = (int)i/(s*s) % s;
            bVett[2] = Vett[t];
    
            t = (int)i/(s*s*s) % s;
            bVett[3] = Vett[t];
    
            t = (int)i/(s*s*s*s) % s;
            bVett[4] = Vett[t];
    
            printf("%06d = %c%c%c%c%c\n",n,bVett[4],bVett[3],bVett[2],bVett[1],bVett[0]);
    
            fprintf(pFile,"%06d = %c%c%c%c%c\n",n,bVett[4],bVett[3],bVett[2],bVett[1],bVett[0]);
            n++;
    	}
        fclose(pFile);
        return 0;
    }
    
    int power(int base, int exponent)
    {
        int i, s=1;
        for (i = 0; i < exponent; ++i)
        s *= base;
        return s;
    }
    
    
  • Re: Algoritmo che genera tutti i numeri possibili formati da 4 cifre

    Spark ha scritto:


    Grazie alexv.
    Ho modificato la mia soluzione in modo da poter decidere anche il numero dei caratteri (LUN).
    Mi chiedevo se fosse possibile farlo anche con la soluzione di weirstrass che ad occhio mi sembra la più semplice.
    No, perché lì il numero LUN è determinato implicitamente dal numero di cicli for annidati, che sono 4. In effetti la soluzione di Weistress pure è una ricorsione, la mia è più generale. Il mio LUN è k e si può anche inserire da tastiera nel main.
Devi accedere o registrarti per scrivere nel forum
40 risposte