sub dividiere {
    my ( $dividend, $dividendexp, $divisor, $divisorexp ) = @_;

    my ( $stellendividend, $stellendivisor, $stellengesamt, $ergebnis,
	 $zeilen, $vorzeichendividend, $vorzeichendivisor, $stellenergebnis,
	 $ende, $zwischenergebnis, $i, $merkezahl, $differenz, $starte, $rest,
	 $reststellen );

    if ( $divisorexp < 0 ) {
	$rest =
	    ( ( $dividend * 10**$dividendexp * 10**( -$divisorexp ) ) %
	      ( $divisor * 10**$divisorexp * 10**( -$divisorexp ) ) );
    }
    else {
	$rest = ( ( $dividend * 10**$dividendexp ) % ( $divisor * 10**$divisorexp ) );
    }
    if ( $rest != 0 ) {	$reststellen = vorkommastellen($rest) + 1; }
    else { $reststellen = 0; }

    my @ergebnisvektor = ();
    for ( $i = 0 ; $i <= 100 ; $i++ ) {
	$ergebnisvektor[$i] = "";
    }

## Haben die Zahlen ein negatives Vorzeichen?
    if ( $divisor < 0 ) { $vorzeichendivisor = 1; }
    else { $vorzeichendivisor = 0; }
    if ( $dividend < 0 ) { $vorzeichendividend = 1; }
    else { $vorzeichendividend = 0; }

    $dividend = abs($dividend);
    $divisor  = abs($divisor);

## Vor- oder Nachkommastellen?

    if ( $dividendexp >= 0 ) {
	$stellendividend = vorkommastellen( $dividend * 10**$dividendexp );
    }
    else {
	$stellendividend = vorkommastellen($dividend);
	if ( $stellendividend <= abs($dividendexp) ) {
	    $stellendividend = abs($dividendexp) + 1;
	}
    }
    if ( $divisorexp >= 0 ) {
	$stellendivisor = vorkommastellen( $divisor * 10**$divisorexp );
    }
    else {
	$stellendivisor = vorkommastellen($divisor);
	if ( $stellendivisor <= abs($divisorexp) ) {
	    $stellendivisor = abs($divisorexp) + 1;
	}
    }

    if ( $dividendexp - $divisorexp >= 0 ) {
	$stellenergebnis =
	    vorkommastellen( ( $dividend * 10**$dividendexp ) / ( $divisor * 10**$divisorexp ) );
    }
    else {
	$stellenergebnis = vorkommastellen( $dividend / $divisor );
	if ( $stellenergebnis <= abs( $dividendexp - $divisorexp ) ) {
	    $stellenergebnis = abs( $dividendexp - $divisorexp ) + 1;
	}
    }

    $stellengesamt =
	$stellendividend + 1 + $stellendivisor + $vorzeichendividend + $vorzeichendivisor + 1 +
	$stellenergebnis + $reststellen;

## Der Tabellenkopf wird geschrieben, wie viele Stellen sind vorhanden.

    tabellenkopf($stellengesamt);

## Die erste Zeile wird geschrieben
## Was ist zu rechnen

    if ( $vorzeichendividend == 1 ) {	schreibezelle( "\$-\$", 1, 1 );    }
    schreibezahlintabelle( $dividend, $dividendexp, 1, $stellendividend + $vorzeichendividend );
    ## fuer Zwischenrechnungen
    for ( $i = 0 ; $i < 100 ; $i++ ) {
	schreibezahlintabelle( 0, 0, 0, $i );
    }
    schreibezahlintabelle( $dividend, $dividendexp, 0, $stellendividend + $vorzeichendividend );
    schreibezelle( "\$:\$", 1, $stellendividend + 1 + $vorzeichendividend );
    if ( $vorzeichendivisor == 1 ) {
	schreibezelle( "\$-\$", 1,
		       $stellendividend + 1 + $vorzeichendividend + $vorzeichendivisor );
    }

    schreibezahlintabelle( $divisor, $divisorexp, 1,
			   $stellendividend + $vorzeichendividend + 1 + $stellendivisor + $vorzeichendivisor );

    schreibezelle( "\$=\$", 1,
		   $stellendividend + 1 + $vorzeichendividend + $vorzeichendivisor + $stellendivisor + 1 );

    schreibezahlintabelle(
	$dividend / $divisor,
	$dividendexp - $divisorexp,
	1, $stellengesamt - $reststellen
	);

    if ( $rest != 0 ) {
	schreibezelle( "R", 1, $stellengesamt - ( $reststellen - 1 ) );
	schreibezahlintabelle( $rest, 0, 1, $stellengesamt );
    }

    $zeilen = 1;

    lesetabellenzeile( 1, $stellengesamt );

    if ( $dividendexp > 0 ) {
	$dividend = $dividend * 10**$dividendexp;
    }

    if ( $divisorexp > 0 ) {
	$divisor = $divisor * 10**$divisorexp;
    }

    if ( $divisorexp < 0 ) {
	$divisor  = $divisor * 10**( -$divisorexp ) * 10**($divisorexp);
	$dividend = $dividend * 10**( -$divisorexp );
    }

    for ( $i = 0 ; $i < $stellenergebnis ; $i++ ) {
	$ergebnisvektor[ $stellenergebnis - $i ] = zusammensetzen(
	    1,
	    $stellengesamt - $reststellen - $i,
	    $stellengesamt - $reststellen - $i
	    );    
    }
    $ende = $differenz = $starte = 0;
    $zeilen++;
    my $anfang = 1;
    my $start  = 1;
    for ( $j = 1 ; $j <= $stellengesamt ; $j++ ) {
	if ( teilersein( zusammensetzen( 0, $anfang, $j ), int( $ergebnisvektor[1] * $divisor ) ) ==
	     1 )
	{
	    if ( $starte == 0 ) {
		$merkezahl = zusammensetzen( 0, $anfang, $j );
		$starte    = 1;
		$ende      = $j;
	    }
	}
    }

    for ( $i = 1 ; $i <= $stellenergebnis ; $i++ ) {
	$zwischenergebnis = int( $ergebnisvektor[$i] * $divisor );

	if ( $ergebnisvektor[$i] != 0 ) {

	    $differenz = $merkezahl - $zwischenergebnis;

	    for ( $j = 1 ; $j <= $ende ; $j++ ) {
		schreibezahlintabelle( 0, 0, 0, $j );
	    }

	    schreibezahlintabelle( $differenz, 0, 0, $ende );

	    if ( $i > 1 ) {
		schreibezahlintabelle( $merkezahl, 0, $zeilen, $ende );
		lesetabellenzeile( $zeilen, $stellengesamt );
		$zeilen++;
		schreibezahlintabelle( $differenz, 0, 0, $ende );
	    }

	    if ( $zwischenergebnis != 0 ) {
		schreibezahlintabelle( $zwischenergebnis, 0, $zeilen, $ende );
		lesetabellenzeile( $zeilen, $stellengesamt );
		ausgabe( "\\cline{" . $start . "-" . $ende . "}" );
		$zeilen++;
		schreibezahlintabelle( $differenz, 0, $zeilen, $ende );
	    }
	}
	$ende++;
	$merkezahl = zusammensetzen( 0, $anfang, $ende );
	$starte = 0;
	for ( $j = 1 ; $j <= $ende ; $j++ ) {

	    if ( zusammensetzen( 0, $j, $j ) == 0 ) {
		if ( $starte == 0 ) { $start = $j + 1; }
	    }
	    else { $starte = 1; }
	}
    }
    $zeilen++;
    $ende = vorkommastellen($dividend);
    schreibezahlintabelle( $rest, 0, $zeilen, $ende );
    lesetabellenzeile( $zeilen, $stellengesamt );
    tabellenfuss();
}
