Vérifier si un nombre est divisible par 3

je dois trouver si un nombre est divisible par 3 sans utiliser % , / ou * . L'indication donnée était d'utiliser la fonction atoi() . Aucune idée de comment le faire?

35
demandé sur hichris123 2010-08-06 10:55:39

17 réponses

soustrayez 3 jusqu'à ce que vous

a) a frappé 0 - nombre est divisible par 3

b) obtenir un nombre moins de 0-Nombre n'était pas divisible

-- version modifiée pour corriger les problèmes notés

while n > 0:
    n -= 3
while n < 0:
    n += 3
return n == 0
60
répondu Forrest Voight 2012-09-11 04:12:46

les réponses actuelles se concentrent toutes sur les chiffres décimaux, en appliquant le"Ajouter tous les chiffres et voir si cela divise par 3". Cette astuce fonctionne en fait dans hex aussi bien; par exemple 0x12 peut être divisé par 3 parce que 0x1 + 0x2 = 0x3. Et "convertir" en hex est beaucoup plus facile que de convertir en décimal.

Pseudo-code:

int reduce(int i) {
  if (i > 0x10)
    return reduce((i >> 4) + (i & 0x0F)); // Reduces 0x102 to 0x12 to 0x3.
  else
   return i; // Done.
}
bool isDiv3(int i) {
  i = reduce(i);
  return i==0 || i==3 || i==6 || i==9 || i==0xC || i == 0xF;
}

[modifier] Inspiré par R, une version plus rapide (o log n):

int reduce(unsigned i) {
  if (i >= 6)
    return reduce((i >> 2) + (i & 0x03));
  else
   return i; // Done.
}
bool isDiv3(unsigned  i) {
  // Do a few big shifts first before recursing.
  i = (i >> 16) + (i & 0xFFFF);
  i = (i >> 8) + (i & 0xFF);
  i = (i >> 4) + (i & 0xF);
  // Because of additive overflow, it's possible that i > 0x10 here. No big deal.
  i = reduce(i);
  return i==0 || i==3;
}
70
répondu MSalters 2018-05-27 11:27:35

divise le numéro en chiffres. Ajouter les chiffres ensemble. Répétez jusqu'à ce qu'il ne vous reste qu'un chiffre. Si ce chiffre est de 3, 6 ou 9, le nombre est divisible par 3. (Et n'oubliez pas de traiter 0 comme un cas spécial).

32
répondu tdammers 2010-08-06 08:39:11

bien que la technique de conversion en chaîne et d'addition des décimales soit élégante, elle nécessite la division ou est inefficace dans l'étape de conversion en chaîne. Est-il un moyen d'appliquer l'idée directement à un nombre binaire, sans d'abord la conversion d'une chaîne de chiffres après la virgule?

il s'avère qu'il y a:

étant donné un nombre binaire, la somme de ses bits impairs moins la somme de ses bits pairs est divisible par 3 iff le nombre original était divisible par 3.

par exemple: prenez le numéro 3726, qui est divisible par 3. En binaire, c'est 111010001110 . Donc nous prenons les nombres impairs, en commençant par la droite et en se déplaçant à gauche, qui sont [1, 1, 0, 1, 1, 1]; la somme de ces derniers est 5 . Les parties égales sont [0, 1, 0, 0, 0, 1]; la somme de ces derniers est 2 . 5-2 = 3, dont nous pouvons conclure que le nombre original est divisible par 3.

17
répondu Tom Crockett 2010-08-06 11:16:43

un nombre divisible par 3, iirc a une caractéristique que la somme de son chiffre est divisible par 3. Par exemple,

12 -> 1 + 2 = 3
144 -> 1 + 4 + 4 = 9
6
répondu Eugene Yokota 2010-08-06 07:04:26

la question de l'entrevue vous demande essentiellement de trouver (ou d'avoir déjà connu) la règle de divisibilité raccourci avec 3 comme diviseur.

L'une des règles de divisibilité pour 3 est la suivante:

prendre n'importe quel numéro et additionner chaque chiffre du numéro. Ensuite, prenez cette somme et déterminez si elle est divisible par 3 (répétant la même procédure que nécessaire). Si le nombre final est divisible par 3, alors le nombre original est divisible par 3.

exemple:

16,499,205,854,376
=> 1+6+4+9+9+2+0+5+8+5+4+3+7+6 sums to 69
=> 6 + 9 = 15 => 1 + 5 = 6, which is clearly divisible by 3.

voir aussi

6
répondu polygenelubricants 2010-08-06 07:11:33

étant donné un nombre X. Convertissez x en chaîne. Analyser la chaîne caractère par caractère. Convertissez chaque caractère analysé en un nombre (en utilisant atoi ()) et additionnez tous ces nombres en un nouveau nombre Y. Répétez le processus jusqu'à ce que votre résultante finale nombre est un chiffre. Si ce chiffre est soit 3,6 soit 9, le nombre d'origine x est divisible par 3.

5
répondu Amichai 2010-08-06 07:00:56

Ma solution en Java ne fonctionne que pour la version 32 bits unsigned int .

static boolean isDivisibleBy3(int n) {
  int x = n;
  x = (x >>> 16) + (x & 0xffff); // max 0x0001fffe
  x = (x >>> 8) + (x & 0x00ff); // max 0x02fd
  x = (x >>> 4) + (x & 0x000f); // max 0x003d (for 0x02ef)
  x = (x >>> 4) + (x & 0x000f); // max 0x0011 (for 0x002f)
  return ((011111111111 >> x) & 1) != 0;
}

d'abord réduit le nombre à un nombre inférieur à 32. La dernière étape vérifie la divisibilité en déplaçant le masque le nombre approprié de fois vers la droite.

3
répondu Roland Illig 2010-10-09 19:20:22

vous n'avez pas étiqueté CE C, mais puisque vous avez mentionné atoi , je vais donner une solution de C:

int isdiv3(int x)
{
    div_t d = div(x, 3);
    return !d.rem;
}
3
répondu R.. 2018-05-30 07:55:17
bool isDiv3(unsigned int n)
{
    unsigned int n_div_3 =
        n * (unsigned int) 0xaaaaaaab;
    return (n_div_3 < 0x55555556);//<=>n_div_3 <= 0x55555555

/*
because 3 * 0xaaaaaaab == 0x200000001 and
 (uint32_t) 0x200000001 == 1
*/
}

bool isDiv5(unsigned int n)
{
    unsigned int n_div_5 =
        i * (unsigned int) 0xcccccccd;
    return (n_div_5 < 0x33333334);//<=>n_div_5 <= 0x33333333

/*
because 5 * 0xcccccccd == 0x4 0000 0001 and
 (uint32_t) 0x400000001 == 1
*/
}

suivant la même règle, pour obtenir le résultat du test de divisibilité par 'n', Nous pouvons : multiplier le nombre par 0x1 0000 0000 - (1 / n)*0xffffff comparer à (1 / n) * 0xffffffff

la contrepartie est que pour certaines valeurs, le test ne sera pas en mesure de retourner un résultat correct pour tous les 32bit nombres que vous voulez tester, par exemple, avec Divisibilité par 7 :

we got 0x100000000 - (1 / n)*0xffff = 0xDB6DB6DC et 7 * 0xDB6DB6DC = 0x6 0000 0004, Nous ne testerons qu'un quart des valeurs, mais nous pouvons certainement éviter cela avec des soustractions.

autres exemples:

11 * 0xE8BA2E8C = A0000 0004, un quart des valeurs

17 * 0xF0F0F0F1 = 10 0000 0000 1 comparer à 0xf0f0f0f0f Toutes les valeurs !

etc., nous pouvons même tester chaque nombre en combinant des nombres naturels entre eux.

3
répondu Pierre-Alexandre 2018-05-30 07:55:36

un nombre est divisible par 3 si tous les chiffres du nombre lorsqu'ils sont ajoutés donnent un résultat 3, 6 ou 9. Par exemple 3693 est divisible par 3 3+6+9+3 = 21 et 2+1=3 et 3 est divisible par 3.

2
répondu Kangkan 2010-08-06 07:06:35

bien un nombre est divisible par 3 si toute la somme des chiffres du nombre est divisible par 3. vous pouvez donc obtenir chaque chiffre comme une sous-couche du numéro d'entrée et ensuite les additionner. vous serait alors répétez ce processus jusqu'à ce qu'il n'y a qu'un seul chiffre résultat.

si c'est 3, 6 ou 9 le nombre est divisable par 3.

1
répondu GorillaPatch 2010-08-06 07:00:22
inline bool divisible3(uint32_t x)  //inline is not a must, because latest compilers always optimize it as inline.
{
    //1431655765 = (2^32 - 1) / 3
    //2863311531 = (2^32) - 1431655765
    return x * 2863311531u <= 1431655765u;
}

sur certains compilateurs c'est encore plus rapide que la voie régulière: x % 3 . Lire la suite ici .

1
répondu ST3 2017-05-23 12:34:23

C# Solution pour vérifier si un nombre est divisible par 3

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int num = 33;
            bool flag = false;

            while (true)
            {
                num = num - 7;
                if (num == 0)
                {
                    flag = true;
                    break;
                }
                else if (num < 0)
                {
                    break;
                }
                else
                {
                    flag = false;
                }
            }

            if (flag)
                Console.WriteLine("Divisible by 3");
            else
                Console.WriteLine("Not Divisible by 3");

            Console.ReadLine();

        }

    }
}
0
répondu mr_eclair 2012-02-25 11:28:20

Voici votre solution optimisée que chacun doit savoir.................

Source: http://www.geeksforgeeks.org/archives/511

programme:

#include<stdio.h>


int isMultiple(int n)
{
    int o_count = 0;
    int e_count = 0;


    if(n < 0)  
           n = -n;
    if(n == 0) 
           return 1;
    if(n == 1)
           return 0;

    while(n)
    {

        if(n & 1)
           o_count++;
        n = n>>1;


        if(n & 1)
            e_count++;
        n = n>>1;
    }

     return isMultiple(abs(o_count - e_count));
}


int main()
{
    int num = 23;
    if (isMultiple(num))
        printf("multiple of 3");
    else
        printf(" not multiple of 3");

    return 0;
}
0
répondu Anil Kumar Arya 2012-06-04 16:24:26

Un nombre est divisible par 3 ssi la somme de ses chiffres est divisible par 3. Vous pouvez utiliser cette définition de façon récursive jusqu'à ce qu'il vous reste un seul chiffre. Si le résultat est 3, 6 ou 9, le nombre original est divisible par 3 sinon ce n'est pas le cas.

Exaple: 33333 => 15 (3+3+3+3+3) => 6 (1+5) donc 33333 est divisible par 3.

voir règles de divisibilité

0
répondu Kartik Kukreja 2013-12-22 17:16:37
  • voici un pseudo-algol que j'ai inventé .

suivons la progression binaire de multiples de 3

000 011
000 110

001 001
001 100
001 111

010 010
010 101


011 000
011 011
011 110

100 001
100 100
100 111

101 010
101 101

juste une remarque que, pour un binaire multiple de 3 x=abcdef en suivant les couples abc =(000,011),(001,100),(010,101) cde fais le changement , donc, ma proposition de algorithme :

divisible(x):

    y = x&7

    z = x>>3

    if number_of_bits(z)<4

        if z=000 or 011 or 110 , return (y==000 or 011 or 110) end

        if z=001 or 100 or 111 , return (y==001 or 100 or 111) end

        if z=010 or 101 , return (y==010 or 101) end

    end

    if divisible(z) , return (y==000 or 011 or 110) end

    if divisible(z-1) , return (y==001 or 100 or 111) end

    if divisible(z-2) , return (y==010 or 101) end

end
-1
répondu Abr001am 2015-05-18 21:24:32