För att förtydliga det hela lite
Kod: Markera allt
int m = t;
while( n % m != 0 ||t % m !=0) {
m = m-1;
}
Detta hittar ju det största tal lika med eller mindre än täljaren som både täljare och nämnare är jämnt delbart med. Nu är det ju lite onödigt att börja med täljaren om den är större än nämnaren, så en första sätt att förbättra det vore att börja m på det minsta av t och n.. Men som pbgp säger så är detta m benämnt "största gemensamma delare" och kan beräknas med Euklides algoritm. pbgps kod är dock onödigt komplicerad, då den använder ett xor-trick för att få minsta delen.. skulle jag koda det hela skulle jag skriva enl. följande
Kod: Markera allt
unsigned int gcd(unsigned int a, unsigned int b)
{
int c;
if (a < b) {
// Swap so a is larger
c = a; a = b; b = c;
}
while (b != 0) {
c = b;
b = a % b;
a = c;
}
return a;
}
...
int divider;
divider = gcd(t, n);
if (divider > 1) {
t = t / divider;
n = n / divider;
}
Om man är på en platform där modulo-operatorn är dyr går det också implementera Euklides algoritm med upprepad subtraktion enl
Kod: Markera allt
unsigned int gcd(unsigned int a, unsigned int b)
{
int c;
if (a < b) {
// Swap so a is larger
c = a; a = b; b = c;
}
while(b != 0) {
if (a > b) {
a = a - b;
} else {
b = b - a;
}
}
return a;
}