Brüche systematisch kürzen

martinibook

martinibook

Aktives Mitglied
Thread Starter
Dabei seit
20.08.2005
Beiträge
8.730
Reaktionspunkte
350
Hallo,

Mein Casio Taschenrechner kann irgendwie Brüche kürzen. Ich habe das mal gelernt, mit Primfaktorenzerlegung und größter, gemeinsamer Teiler usw.

Ich möchte bei meiner Bilderdatenbank in PHP das Bildverhältnis angeben, allerdings nicht im 1:1,33 Stil sondern im 3:4 Stil. Geht das irgenwie?

Martin
 
Ich hab mal irgendwo Code (in C) für den größten gemeinsamen Teiler gefunden:
Code:
int gcd(int x, int y) // greatest common divisor
{	
	if (x < 0)
	{
		x = -x;
	}
	if (y < 0)
	{
		y = -y;
	}
	while (true)
	{
		if (x == 0)
		{
			return y;
		}
		y = y % x;		
		if (y == 0)
		{
			return x;
		}
		x = x % y;
	}
}
 
Es ist schon spät, aber ist das nicht identisch?

3:4 = 3 x (1:1,33)
 
martinibook schrieb:
das Bildverhältnis angeben, allerdings nicht im 1:1,33 Stil sondern im 3:4 Stil. Geht das irgenwie?

Martin
Im Allgemeinen nicht, denn das läuft darauf hinaus, die reellen Zahlen durch die rationalen zu ersetzen, was schwerlich geht. ;)

ansonsten:
PHP:
function kuerze (&$z, &$n)
{
	if ( 0 == ($z = (int) $z) || 0 == ($n = (int) $n) ) 
	  	return;
	
 	$a = $z < 0 ? -$z : $z;
	$b = $n < 0 ? -$n : $n;
	
	do
	{
		$mod =  $a % $b; 
		$a = $b; 
		$b = $mod;
 	}
	while($mod > 0);
	
	$z /= $a;
	$n /= $a;
}
 
Zuletzt bearbeitet:
Okay, das sieht ganz gut aus. Ich verstehe die Funktionsweise noch nicht so ganz, allerdings kann ich das noch später machen.

Danke für eure Quelltexte.
 
Ich verstehe einfach nicht warum man auf diese Weise einen Teiler rausbekommt, aber wenn ich mal Zeit habe, gehe ich das durch.

Martin
 
PHP:
<?PHP
	
	function kuerze (&$z, &$n)
		{
 		if (0 == ($z = (int) $z) || 0 == ($n = (int) $n)) 
 			return;
 
 		$a = $z < 0 ? -$z : $z;
 		$b = $n < 0 ? -$n : $n;
 
 		do
 			{
 			$mod = $a % $b; 
 			$a = $b; 
 			$b = $mod;
 			}
 		while($mod > 0);
 
 		$z /= $a;
 		$n /= $a;
	 	} 

 $zaehler = 24;
 $nenner = 6;

 kuerze($zaehler, $nenner);

 echo $zaehler . ' &divide; ' . $nenner;

Wird zu:

4 / 1
 
martinibook schrieb:
PHP:
 $zaehler = 24;
 $nenner = 6;

 kuerze($zaehler, $nenner);

 echo $zaehler . ' &divide; ' . $nenner;

Wird zu:

4 / 1
Also das halte ich für ein durchaus akzeptables Ergebnis!! ;)
 
Meinst du das Anwendungsskript oder einfach den End-Bruch?
 
martinibook schrieb:
Meinst du das Anwendungsskript oder einfach den End-Bruch?
Den Bruch, ob unecht oder nicht. ;) Das Script sollte ebenfalls bug-frei sein.
 
Zurück
Oben Unten