Divisibilité par 3

Un nombre \(n\) est divisible par \(3\) si le reste de la division euclidienne de \(n\) par \(3\) vaut \(0\).

On se propose dans cet exercice de tester de trois manières différentes si un entier \(n\) est divisible par \(3\).

On demande donc, dans chaque question, d'écrire une version de la fonction est_divisible_par_3 qui prend en paramètre un entier positif ou nul n et renvoie True si n est divisible par \(3\), False dans le cas contraire.

Exemples
🐍 Script Python
>>> divisible_par_3(0)
True
>>> divisible_par_3(1)
False
>>> divisible_par_3(3)
True
>>> divisible_par_3(9230)
False
>>> divisible_par_3(9231)
True
>>> divisible_par_3(9232)
False
assert ?

Le mot clé assert est utilisé en Python afin de vérifier que des propositions sont vraies.

Ainsi, l'instruction assert 3 + 5*7 == 38 permet de vérifier que l'expression 3 + 5*7 est bien évaluée à 38.

Si c'est le cas, le programme continue de se dérouler normalement. Dans le cas contraire, le programme est interrompu et une erreur est signalée.

Version native

L'opérateur % de Python renvoie le reste de la division euclidienne des deux nombres proposés.

Ainsi, 25 % 3 est évalué à 1 car \(25 = 8 \times 3 + \mathbf{1}\).

Contrainte

Dans cette version, on autorise l'utilisation de n % 3.

Défi : du premier coup !

Pouvez-vous compléter cette fonction en ajoutant une seule ligne ?

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013be%nvi3mo_tPhklpwf(: cga=ry0Su/)2s1d050K0c0l0y0g0p0I0v0w0p0y0I0I0z010l0g0q010406050I0E0i0i0y0A0B040D0j0p0E0#0j0e050F0,0.0:0=0*0q0405150~180F150*0K0g0f0T0V0X0Z0n0g0x0n0p1m0n0l0(050O0b0p0c1h0W0Y011l1n1p1n0l1v1x1t0l0A160l0n0T0^0I0q0y0e0Z0H011z1j010s0Q0c0e0y0i0c1t1S1U1Z1B1$1x1)1+0(0a0v0m0A0j0q0j0I0g0{0e0v0M1Q0A0A0c0w230~1.0e160F1O2g1L1N1M1u0K1:0Z1p0e1(201t1e1g0U1A2q0g2s0e0j2w1t0q29162e2g2K0+1T242y1!2D0A0/0p0(0J2d2O0)2N1/2Q1B2S2U0(0H2Y1U2g2H0c2g2w2j0K1N2o2%0Z0w2E1,162?172I2#2f2-352}0M2J2O2p010o0(0M0s363a2$1i1B0r0(0v3i343c0e0s3f1f0g211w0c0k1T0A0k0h3q2e3c0%040t3G3b2{010e0(0}0 2Z3r3O3J0G0u3i060v3$3p3H3O3e04290l0E0A3S2K3(3N3l0Z3Q043;2Z3?3k2z010j0(0d3i3~2P3^010i0g0(3F3T2.463c42040z0z453V484a0(0C3!0~382;19330F312h2^0~2k4C0y3z2=1f2!4y0N0P0R04.
Version « en chaîne »

Dans cette version, on se propose d'utiliser la règle de divisibilité enseignée dans les petites classes :

Somme des chiffres

Un nombre \(n\) est divisible par \(3\) si et seulement si la somme de ses chiffres est divisible par \(3\).

On peut répéter cette règle à plusieurs reprises jusqu'à ce que la somme des chiffres soit strictement inférieure à \(10\). Dans ce cas, les seuls entiers divisibles par \(3\) sont \(0\), \(3\), \(6\) ou \(9\).

Dans cette version, on parcourt les chiffres d'un entier après l'avoir converti en une chaîne de caractères comme illustré ci-dessous :

🐍 Script Python
>>> n = 1234
>>> chaine = str(n)
>>> for chiffre in chaine:
...     print(chiffre)
...
1
2
3
4

La fonction int permet de faire l'opération inverse :

🐍 Script Python
>>> '1' + '2'
'12'
>>> int('1') + int('2')
3
Contrainte

Dans cette version, on interdit l'utilisation de n % 3.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013beqên,4é9vi+3mo5_tLR;Phklpwf(: cg.a=ry0S6Iu/72)s18d050Z0c0s0J0l0z0W0F0G0z0J0W0W0K010s0l0A010406050W0R0o0o0J0L0M040O0p0z0R0@0p0f0F020J0o0A0v0F0u0c110L0d0R0c0W050S0~1012140|0A04051z1s1C0S1z0|0Z0l0k0,0.0:0=0x0l0H0x0z1Q0x0s0`050%0b0z0c1L0/0;011P1R1T1R0s1Z1#1X0s0L1A0s0x0,170W0A0J0f0=0U011%1N010C0)0c0f1f0c1X1}1 241)271#2a0o2c040a0F0w0L0p0A0p0W0l1a1c0#1{0L0L0c0G2x1s2e0f1A0S1_2J1?1^1@1Y0Z2g0=1T0f292u1X1I1K0-1(2T0l2V0f0p2Z1X0A2C1A2H2J2;0}1~1c2#252*0L110z0`0X2G2^0{2@2f2`1)2|2~0`0U321 342H2S01390J2 040n3d2I0|3g370=3j3l0h3o3f2^3h3u0`0q3x3q3z3s3i0p2}3k0`0P3E352_1M383J3a040T3O3r3R3t3T3L040Y3X3G3Z3I3K3l0j3x1D2/1s2Z2M0Z1^2R3H0G2+2m0!1J1A2.0c2:333:3}0#45363+0y0`0#0C3:3Y2$010B0`0F4h3*4j0f0C4e1J0l2v1!0c0r1~0L0r3n1t464i250_040D4o4b4q0`0f4L3Q4j4I0V0E3E0F4X4n4G1)4d040B1P1#3x4Z4p2{4O4+3P3h0p0`020H0s0v4:4!0=0o0l300N4Q3h4I4V4E3e064Y5a4,4M4.040G0x0(2V4|4-1)4?040K5k5d380b0`0W1?533H4I4K572I4;3H0f4/5B4a4R4H0`0V4W5b4X5D3+5F040W0p100c5q5J5m0`5p5H5c5Z4~5004525H595O5(3h4$0C3J5Y3A0`5g0l0C0C2C5_3H0p4l042(615R5{5h2(5X5H5Q4S0`562;5/5:4Y6e254$5}674N5f1P5~605%6m5m642*0s6q25630`666w4}010W2204021o0p4`0N0n0P0j6N0R6P4{6d6I555N6k5O6x3t5u5V2l6C5!5o6.6*5T6,6c2;5;620`0m6;3i5t650f6B6Z5l0=5z5x686s5}5 6^4F75014T6$5b6)3i5G6_7k5n5$7n6I5S5U5W7i7k4$2C0s0R0L4P6H7f5S7D7r7f6E716~77745r5*0`5-2?6!0`0g6~4 0`4D7T7f4I7W7E7P017Y043N7O5)7g7V7X5+3/7/545L3O0S48443;7 0S3@1s0s3_842P2K0J4x2J3@1y5I3h2C0o0r0C0J0y4y0x0n0`1k1m1o1q0F6h461F341z0Q0z0F1q0s0F2t0:0l4x0F0Z002s0@4 0W0c0L0,0$0s1$0J0A2.0p5g1$290F0p0b8R0L0k1 8F1o000)8D5v0F2(19288L1$8W0f0l8T3}1g8W8}0+5|6u8u057~3h1+1S1U1W8f3H7,7S8x7~040g4n9c3H9e1-1V2d7f7,7!9m3~9o9q3~9d1U9u9h7k7,7.2?7}9B8D8F9b9E9s9G9g9w7*7,7^9M9n0F0z3J0+0#0+0J0Z1I2x0+0D0i0%728L4u4w1#0+4A9D2z9T1,9V9i3+9y3:9N499p0)9|0c0R0k298F0e1?1$1Q2|0i0W0I0V0I1D8z040t0J0F5@0f2E0l1b8}0k0laf0F3k9(8var1H1J9Fa11.9W7:2i292b0`2o0O0G0L0^8F0w0M1_1b3:435I2=469n7x4e0c4g7_3H644na@5R4s042Z4v8J1#4z124C786f4Jb65e7H7e7*4T8w585aa:4%4)7d3e6`79bbbm7o4@4_6Y7I9X5+0X9l3e7k6#5.6k7k5S5g5ibl2Ibn4j7p6~0f705v0Lb91)7N7#7*7GbT767{bD5:bF6+7v7)7:bNb+3h9k7ibh6I5?5^b.5E697b6vbvb,646Gb~5`6sbIbZ7;04bf3p6%6lb?6Fa?c2b`7a996~7K6Ackc0bpbK7k6K4@6O6Q6S6Ucububc7:bC6icb6(7sb)6-b_3+b-cg797ucIcMbM6|bO702(73bWcB0`5AcXc3987cc67hb$cF7F7m33bL6D5#cT6F72c)cZc67t6@c_045Mc+c:4#0`7z7Bcp04d26=d7d9017Kc1c/bBc`a{4jb:dj5K9o7?7Zc~7(cQ259Kdrdp049ZcA7`c 7|a/1F3=82410|820$0(0*04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013beqên,4é9vi+3mo5_tLR;Phklpwf(: cg.a=ry0S6Iu/72)s18d050Z0c0s0J0l0z0W0F0G0z0J0W0W0K010s0l0A010406050W0R0o0o0J0L0M040O0p0z0R0@0p0f0F020J0o0A0v0F0u0c110L0d0R0c0W050S0~1012140|0A04051z1s1C0S1z0|0Z0l0k0,0.0:0=0x0l0H0x0z1Q0x0s0`050%0b0z0c1L0/0;011P1R1T1R0s1Z1#1X0s0L1A0s0x0,170W0A0J0f0=0U011%1N010C0)0c0f1f0c1X1}1 241)271#2a0o2c040a0F0w0L0p0A0p0W0l1a1c0#1{0L0L0c0G2x1s2e0f1A0S1_2J1?1^1@1Y0Z2g0=1T0f292u1X1I1K0-1(2T0l2V0f0p2Z1X0A2C1A2H2J2;0}1~1c2#252*0L110z0`0X2G2^0{2@2f2`1)2|2~0`0U321 342H2S01390J2 040n3d2I0|3g370=3j3l0h3o3f2^3h3u0`0q3x3q3z3s3i0p2}3k0`0P3E352_1M383J3a040T3O3r3R3t3T3L040Y3X3G3Z3I3K3l0j3x1D2/1s2Z2M0Z1^2R3H0G2+2m0!1J1A2.0c2:333:3}0#45363+0y0`0#0C3:3Y2$010B0`0F4h3*4j0f0C4e1J0l2v1!0c0r1~0L0r3n1t464i250_040D4o4b4q0`0f4L3Q4j4I0V0E3E0F4X4n4G1)4d040B1P1#3x4Z4p2{4O4+3P3h0p0`020H0s0v4:4!0=0o0l300N4Q3h4I4V4E3e064Y5a4,4M4.040G0x0(2V4|4-1)4?040K5k5d380b0`0W1?533H4I4K572I4;3H0f4/5B4a4R4H0`0V4W5b4X5D3+5F040W0p100c5q5J5m0`5p5H5c5Z4~5004525H595O5(3h4$0C3J5Y3A0`5g0l0C0C2C5_3H0p4l042(615R5{5h2(5X5H5Q4S0`562;5/5:4Y6e254$5}674N5f1P5~605%6m5m642*0s6q25630`666w4}010W2204021o0p4`0N0n0P0j6N0R6P4{6d6I555N6k5O6x3t5u5V2l6C5!5o6.6*5T6,6c2;5;620`0m6;3i5t650f6B6Z5l0=5z5x686s5}5 6^4F75014T6$5b6)3i5G6_7k5n5$7n6I5S5U5W7i7k4$2C0s0R0L4P6H7f5S7D7r7f6E716~77745r5*0`5-2?6!0`0g6~4 0`4D7T7f4I7W7E7P017Y043N7O5)7g7V7X5+3/7/545L3O0S48443;7 0S3@1s0s3_842P2K0J4x2J3@1y5I3h2C0o0r0C0J0y4y0x0n0`1k1m1o1q0F6h461F341z0Q0z0F1q0s0F2t0:0l4x0F0Z002s0@4 0W0c0L0,0$0s1$0J0A2.0p5g1$290F0p0b8R0L0k1 8F1o000)8D5v0F2(19288L1$8W0f0l8T3}1g8W8}0+5|6u8u057~3h1+1S1U1W8f3H7,7S8x7~040g4n9c3H9e1-1V2d7f7,7!9m3~9o9q3~9d1U9u9h7k7,7.2?7}9B8D8F9b9E9s9G9g9w7*7,7^9M9n0F0z3J0+0#0+0J0Z1I2x0+0D0i0%728L4u4w1#0+4A9D2z9T1,9V9i3+9y3:9N499p0)9|0c0R0k298F0e1?1$1Q2|0i0W0I0V0I1D8z040t0J0F5@0f2E0l1b8}0k0laf0F3k9(8var1H1J9Fa11.9W7:2i292b0`2o0O0G0L0^8F0w0M1_1b3:435I2=469n7x4e0c4g7_3H644na@5R4s042Z4v8J1#4z124C786f4Jb65e7H7e7*4T8w585aa:4%4)7d3e6`79bbbm7o4@4_6Y7I9X5+0X9l3e7k6#5.6k7k5S5g5ibl2Ibn4j7p6~0f705v0Lb91)7N7#7*7GbT767{bD5:bF6+7v7)7:bNb+3h9k7ibh6I5?5^b.5E697b6vbvb,646Gb~5`6sbIbZ7;04bf3p6%6lb?6Fa?c2b`7a996~7K6Ackc0bpbK7k6K4@6O6Q6S6Ucububc7:bC6icb6(7sb)6-b_3+b-cg797ucIcMbM6|bO702(73bWcB0`5AcXc3987cc67hb$cF7F7m33bL6D5#cT6F72c)cZc67t6@c_045Mc+c:4#0`7z7Bcp04d26=d7d9017Kc1c/bBc`a{4jb:dj5K9o7?7Zc~7(cQ259Kdrdp049ZcA7`c 7|a/1F3=82410|820$0(0*04.
Version « matheuse »

Dans cette version, on se propose d'utiliser une version modifiée de la règle de divisibilité enseignée dans les petites classes.

Somme des chiffres

Un nombre \(n\) est divisible par \(3\) si et seulement si la somme de son nombre de dizaine et de son chiffre des unités est divisible par \(3\).

On répète cette règle jusqu'à ce que cette somme soit strictement inférieure à \(10\). Dans ce cas, les seuls entiers divisibles par \(3\) sont \(0\), \(3\), \(6\) ou \(9\).

Appliquée à \(5\,832\) la règle donne (\(n \equiv r \pmod 3\) est la notation mathématique pour « le reste de la division de \(n\) par \(3\) vaut \(r\) ») :

\(\begin{align*} 5\,832 &\equiv 583 + 2 &\pmod 3 \\ &\equiv 585 &\pmod 3 \\ &\equiv 58 + 5 &\pmod 3 \\ &\equiv 63 &\pmod 3 \\ &\equiv 6 + 3 &\pmod 3 \\ &\equiv 9 &\pmod 3 \\ \end{align*}\)

Comme \(9\) est inférieur à \(10\) et est divisible par \(3\), on peut affirmer que \(5\,832\) est divisible par \(3\).

Il est possible de récupérer la somme envisagée en faisant n // 10 + n % 10 mais aussi, sans utiliser l'opérateur %, en faisant n - 9 * (n // 10)1.

🐍 Script Python
>>> 5832 % 10 + 5832 // 10
585
>>> 5832 - 9 * (5832 // 10)
585
Contraintes

Dans cette version :

  • on interdit l'utilisation de l'opérateur % ;

  • on interdit de convertir l'entier étudié en une chaîne de caractère.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013be%n,49vi3mo_t;Phklpwf(: cga=ry0S6u/2)s1+d050Q0c0o0C0j0t0N0z0A0t0C0N0N0D010o0j0u010406050N0J0l0l0C0E0F040H0m0t0J0+0m0e050K0=0@0_0{0:0u04051b141e0K1b0:0Q0j0i0Z0#0%0)0r0j0B0r0t1s0r0o0.050U0b0t0c1n0$0(011r1t1v1t0o1B1D1z0o0E1c0o0r0Z0~0N0u0C0e0)0L011F1p010w0W0c0e0C0l0c1z1Y1!1)1H1,1D1/1;0.0a0z0q0E0m0u0m0N0j110e0z0S1W0E0E0c0A29141@0e1c0K1U2m1R1T1S1A0Q1_0)1v0e1.261z1k1m0!1G2w0j2y0e0m2C1z0u2f1c2k2m2Q0;1Z2a2E1*2J0E0^0t0.0O2j2U0/2T1^2W1H2Y2!0.0L2(1!2*2k2v012/0C2#040k2?2l0:2_2-0)2|2~0g312m2N0c2m2C2p0Q1T2u35010A2K1=1c3f1d2O2+2l3a053m0S2P2U2`0s0.0S0w3v341o1H0v0.0z3G3A3k0e0w3D1l0j271C0c0n1Z0E0n30152)3t2`0-040x3N2,3I360.133%2@3)3k3+0M0y3a060z403M3H2F013C040v1r1D3a423O3:2{3=4b3_4e0m0.020B0o0p4h431*0l0j2$0G3.2V4e3+3}3@32414E4c3/440e4g4C044G4y444k040D4q4d4I4K2Q4N2`4Q0K0K4T4H4s4u040O4w4L4Y3k4Q0P4%4O2X4W2)4/4j0.0d4?2`4t4v3~4E4i44462f0o0J0E3?4X554^045c4`5e1H0m3K042H4 3`0.3-4L5j0)51044-2S4r1H3+0f5p4e5w3$5z4U1*5C5E445w0I4x3*0.5D4.5u015w0h5Q5q040M3~143x3d1f3s0K3q2n3h142q5;0C3W3e1l2*5-0T0V0X04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013be%n,49vi3mo_t;Phklpwf(: cga=ry0S6u/2)s1+d050Q0c0o0C0j0t0N0z0A0t0C0N0N0D010o0j0u010406050N0J0l0l0C0E0F040H0m0t0J0+0m0e050K0=0@0_0{0:0u04051b141e0K1b0:0Q0j0i0Z0#0%0)0r0j0B0r0t1s0r0o0.050U0b0t0c1n0$0(011r1t1v1t0o1B1D1z0o0E1c0o0r0Z0~0N0u0C0e0)0L011F1p010w0W0c0e0C0l0c1z1Y1!1)1H1,1D1/1;0.0a0z0q0E0m0u0m0N0j110e0z0S1W0E0E0c0A29141@0e1c0K1U2m1R1T1S1A0Q1_0)1v0e1.261z1k1m0!1G2w0j2y0e0m2C1z0u2f1c2k2m2Q0;1Z2a2E1*2J0E0^0t0.0O2j2U0/2T1^2W1H2Y2!0.0L2(1!2*2k2v012/0C2#040k2?2l0:2_2-0)2|2~0g312m2N0c2m2C2p0Q1T2u35010A2K1=1c3f1d2O2+2l3a053m0S2P2U2`0s0.0S0w3v341o1H0v0.0z3G3A3k0e0w3D1l0j271C0c0n1Z0E0n30152)3t2`0-040x3N2,3I360.133%2@3)3k3+0M0y3a060z403M3H2F013C040v1r1D3a423O3:2{3=4b3_4e0m0.020B0o0p4h431*0l0j2$0G3.2V4e3+3}3@32414E4c3/440e4g4C044G4y444k040D4q4d4I4K2Q4N2`4Q0K0K4T4H4s4u040O4w4L4Y3k4Q0P4%4O2X4W2)4/4j0.0d4?2`4t4v3~4E4i44462f0o0J0E3?4X554^045c4`5e1H0m3K042H4 3`0.3-4L5j0)51044-2S4r1H3+0f5p4e5w3$5z4U1*5C5E445w0I4x3*0.5D4.5u015w0h5Q5q040M3~143x3d1f3s0K3q2n3h142q5;0C3W3e1l2*5-0T0V0X04.

  1. en effet n % 10 est aussi égal à n - 10 * (n // 10). On a donc (n // 10) + n % 10 = (n // 10) + n - 10 * (n // 10) = n - 9 * (n // 10)