- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 25

Thema: Ein Zahlenproblem

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Rekursiv in C (für den asuro):
    Code:
    // Zahlenproblem rekursiv in C :)                                       29.7.2011 mic
    
    #include "asuro-probot.h"
    #include "asuro-probot.c"
    
    #define ziffern 4
    
    uint8_t muster[ziffern];
    uint8_t x[10], gefunden;
    uint32_t nr=0;
    
    void suchen(uint8_t z)
    {
    	uint8_t y;
    
    	for(x[z]=0; x[z]<10; x[z]++)
    	{
    		gefunden=0;
    		for(y=0; y<z; y++)
    		   if(muster[y]==x[z]) gefunden=1;
    		if(!gefunden)
    		{
    			muster[z]=x[z];
    			if(z < (ziffern-1))
    			{
    				suchen(z+1); // Rekursion!
    			}
    			else
    			{
    				if(0) // 1 bedeutet: Ausgabe der Ziffernkombinationen
    				{
    					PrintInt(nr);
    					SerWrite(": ", 2);
    					for(y=0; y<ziffern; y++)
    					{
    						while(!(UCSRA & 0x20));
    						UDR = muster[y]+'0';
    					}
    					SerWrite("\r\n", 2);
    				}
    				nr++;
    			}
    		}
    	}
    }
    
    int main(void)
    {
    	Init();
    	PORTC |= 3; // Odo-PullUps simulieren für PollSwitch()
    	StatusLED(RED);
    
    	for(x[0]=0; x[0]<10; x[0]++)
    	{
       	muster[0]=x[0];
    		suchen(1);
    	}
    	while(1)
    	{
       	PrintInt(nr);
    		SerWrite("\r\n", 2);
    		Beep(50);
    	}
    return(0);
    }
    Probelauf mit 4 Ziffern ergibt wieder 5040. Speichern will ich das Ergebniss natürlich nicht. Fragt sich nun, wie man die Symmetrien der Ziffernfolgen einbauen könnte.

    Gruß

    mic

    [Edit]
    Nach der Optimierung:
    Code:
    // Zahlenproblem rekursiv in C :)                                       31.7.2011 mic
    
    #include <avr/io.h>
    #include <stdlib.h>
    
    #define ziffern 3
    
    uint8_t x[10], y, gefunden;
    uint32_t nr=1;
    
    void SerWrite(char *data, uint8_t length); // char???
    void PrintInt32(uint32_t wert);
    void ausgabe(void);
    
    void suchen(uint8_t z)
    {
    	for(x[z]=0; x[z]<10; x[z]++)
    	{
    		gefunden=0;
    		for(y=0; y<z; y++) if(x[y]==x[z]) gefunden=1;
    		if(!gefunden)
    		{
    			if(z < (ziffern-1)) suchen(z+1); // Rekursion!
    			else
    			{
    				ausgabe(); // Ausgabe der Ziffernkombinationen in x[0] bis x[ziffern-1]
    				nr++;
    			}
    		}
    	}
    }
    
    int main(void)
    {
    	SerWrite("\033[1;1H", 6); // home  VT100-Emulation
    	SerWrite("\033[2J", 4); //clear terminal screen
    
    	for(x[0]=0; x[0]<5; x[0]++) suchen(1);
    
    	nr--;
    	DDRD |= (1<<PD5); // Led
    	while(1)
    	{
       	PrintInt32(nr);
    		SerWrite("\r\n", 2);
    		if(PIND & (1<<PD5)) PORTD &= ~(1<<PD5); else PORTD |= (1<<PD5); // blinken
    	}
    return(0);
    }
    
    void SerWrite(char *data, uint8_t length) // aus der asuro-Lib
    {
    	unsigned char i = 0;
    	UCSRB = 0x08; // enable transmitter
    	while (length > 0) {
    		if (UCSRA & 0x20) { // wait for empty transmit buffer
    			UDR = data[i++];
    			length --;
    		}
    	}
    	while (!(UCSRA & 0x40));
    	//for (i = 0; i < 0xFE; i++)
    		//for(length = 0; length < 0xFE; length++);
    }
    
    void PrintInt32(uint32_t wert) // aus der asuro-Lib
    {  char text[7]="       ";
    	itoa(wert,text,10);
    	SerWrite(text,7);
    }
    
    void ausgabe(void)
    {
    	for(y=0; y<ziffern; y++)
    	{
    		while(!(UCSRA & 0x20));
    		UDR = x[y]+'0';
    	}
     	SerWrite("  ",2);
    	for(y=0; y<ziffern; y++)
    	{
    		while(!(UCSRA & 0x20));
    		UDR = 9-x[y]+'0';
    	}
     	SerWrite("  ",2);
    	PrintInt32(nr);
     	SerWrite("\r\n",2);
    }
    Ohne Ausgabe schafft mein asuro die 10-stelligen Kombinationen in knapp 22 Minuten :)
    Angehängte Dateien Angehängte Dateien
    Geändert von radbruch (31.07.2011 um 11:11 Uhr) Grund: optimierte Version angefügt
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests