Comment feriez-vous pour diviser un nombre par 3, sans l'aide d' *
, /
, +
, -
, %
, les opérateurs?
Le nombre peut être signé ou non signé.
Comment feriez-vous pour diviser un nombre par 3, sans l'aide d' *
, /
, +
, -
, %
, les opérateurs?
Le nombre peut être signé ou non signé.
Il y a une fonction simple que j'ai trouvé ici.
Mais c'est à l'aide de l' +
de l'opérateur, de sorte que vous devez ajouter les valeurs avec le bit-opérateurs:
// replaces the + operator
int add(int x, int y) {
while(x) {
int t = (x & y) <<1;
y ^= x;
x = t;
}
return y;
}
int divideby3 (int num) {
int sum = 0;
while (num > 3) {
sum = add(num >> 2, sum);
num = add(num >> 2, num & 3);
}
if (num == 3)
sum = add(sum, 1);
return sum;
}
Comme Jim, a commenté ceci fonctionne parce que:
n = 4 * a + b
n / 3 = a + (a + b) / 3
So sum += a, n = a + b
, et de réitérer a == 0 (n < 4)
, sum += floor(n / 3);
c'est à dire 1, if n == 3, else 0
Idiot conditions de l'appel pour un idiot solution:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE * fp=fopen("temp.dat","w+b");
int number=12346;
int divisor=3;
char * buf = calloc(number,1);
fwrite(buf,number,1,fp);
rewind(fp);
int result=fread(buf,divisor,number,fp);
printf("%d / %d = %d", number, divisor, result);
free(buf);
fclose(fp);
return 0;
}
Si la partie décimale est nécessaire, il suffit de déclarer result
comme double
et ajouter à cela le résultat de l' fmod(number,divisor)
.
Explication de la façon dont il fonctionne
fwrite
écrit number
octets (numéro 123456 dans l'exemple ci-dessus).rewind
réinitialise le pointeur de fichier au début du fichier.fread
lit un maximum de number
"dossiers" qui sont divisor
de la longueur à partir du fichier et renvoie le nombre d'éléments à lire.Si vous écrivez 30 octets puis lisez le fichier dans les unités de 3, vous bénéficiez de 10 "unités". 30 / 3 = 10
Utiliser l'assembleur en ligne: (fonctionne aussi pour les nombres négatifs)
#include <stdio.h>
int main() {
int dividend = -42, divisor = 3, quotient, remainder;
__asm__ ( "movl %2, %%edx;"
"sarl $31, %%edx;"
"movl %2, %%eax;"
"movl %3, %%ebx;"
"idivl %%ebx;"
: "=a" (quotient), "=d" (remainder)
: "g" (dividend), "g" (divisor)
: "ebx" );
printf("%i / %i = %i, remainder: %i\n", dividend, divisor, quotient, remainder);
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.