A/B = Q, quindi A = B * Q. Sappiamo entrambi A & B, vogliamo Q.
La mia idea di aggiungere al mix: binario di ricerca D. Inizia con Q = 0 & Q = 1, forse come casi di base. Continua a raddoppiare fino a B * Q> A, e poi hai due limiti (Q e Q/2), quindi trova il Q corretto tra i due. O (log (A/B)), ma un po 'più complicato da implementare:
#include <stdio.h>
#include <limits.h>
#include <time.h>
// Signs were too much work.
// A helper for signs is easy from this func, too.
unsigned int div(unsigned int n, unsigned int d)
{
unsigned int q_top, q_bottom, q_mid;
if(d == 0)
{
// Ouch
return 0;
}
q_top = 1;
while(q_top * d < n && q_top < (1 << ((sizeof(unsigned int) << 3) - 1)))
{
q_top <<= 1;
}
if(q_top * d < n)
{
q_bottom = q_top;
q_top = INT_MAX;
}
else if(q_top * d == n)
{
// Lucky.
return q_top;
}
else
{
q_bottom = q_top >> 1;
}
while(q_top != q_bottom)
{
q_mid = q_bottom + ((q_top - q_bottom) >> 1);
if(q_mid == q_bottom)
break;
if(d * q_mid == n)
return q_mid;
if(d * q_mid > n)
q_top = q_mid;
else
q_bottom = q_mid;
}
return q_bottom;
}
int single_test(int n, int d)
{
int a = div(n, d);
printf("Single test: %u/%u = %u\n", n, d, n/d);
printf(" --> %u\n", a);
printf(" --> %s\n", a == n/d ? "PASSED" : "\x1b[1;31mFAILED\x1b[0m");
}
int main()
{
unsigned int checked = 0;
unsigned int n, d, a;
single_test(1389797028, 347449257);
single_test(887858028, 443929014);
single_test(15, 5);
single_test(16, 4);
single_test(17, 4);
single_test(0xFFFFFFFF, 1);
srand(time(NULL));
while(1)
{
n = rand();
d = rand();
if(d == 0)
continue;
a = div(n, d);
if(n/d == a)
++checked;
else
{
printf("\n");
printf("DIVISION FAILED.\n");
printf("%u/%u = %u, but we got %u.\n", n, d, n/d, a);
}
if((checked & 0xFFFF) == 0)
{
printf("\r\x1b[2K%u checked.", checked);
fflush(stdout);
}
}
return 0;
}
Inoltre, si possono anche iterano attraverso i bit, impostando ciascuno a 1. Se B * Q < = A è vero, mantieni il bit come 1, altrimenti azzeralo. Procedere MSB-> LSB. (Avrete bisogno di essere in grado di rilevarlo B * Q traboccherà, tuttavia
+1 per i compiti di auto-tagging, qualcosa che non ho visto accadere molto spesso finora. – RBerteig