Nombres harshad (itératif)

Un entier naturel non nul \(n\) est dit harshad, si \(n\) est divisible par la somme des chiffres de \(n\). Le nom de harshad a été donné par le mathématicien Dattatreya Ramachandra Kaprekar (1905 - 1986), il signifie "grande joie" en sanskrit.

On précise qu'un nombre entier \(b\) est un « diviseur » de \(a\) si le reste de la division euclidienne de \(a\) par \(b\) vaut \(0\).

Par exemple \(18\) est un nombre harshad car \(1+8=9\) divise \(18\). En effet \(18 =2\times (1+8)+0\).

Le but est d'écrire une fonction permettant de déterminer si un nombre est un nombre harshad ou non. Mais avant cela, il faudra écrire une fonction qui fait la somme des chiffres d'un nombre.

Question 1 : somme des chiffres

Écrire une fonction itérative somme_chiffres qui prend en paramètre un entier positif n et qui renvoie la somme des chiffres de n. On n'utilisera que des opérations mathématiques. On s'interdira donc de convertir n en une chaîne de caractères.

Exemples

>>> somme_chiffres(8)
8
>>> somme_chiffres(18)
9
>>> somme_chiffres(409)
13
str et sum interdits

On interdit dans cet exercice d'utiliser str et sum.

Rappels sur la division euclidienne

Avec Python, on rappelle qu'il est possible de calculer le quotient d'un nombre n par 10 avec l'expression n // 10.

De même, l'expression n % 10 renvoie le reste de la division euclidienne de n par 10.

🐍 Console Python
>>> 409 % 10
9
>>> 409 // 10
40
>>> 40 % 10
0
>>> 40 // 10
4

###(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

.128013s3_ufvy naS1me(PV24:CjtwihE)6Oo;bcdg/0làqApQ.rL-,=+zk%95Rxé050J0o0x0k0z0N0b0i0I0N0k0b0b0Y010x0z0R010406050b0e0n0n0k0U0h040l0F0N0e0 0F0j0i020k0n0R0G0i0)0o190U0P0e0o0b050L16181a1c140R041A1H051K0L1K1M1H140J0z0g0@0_0{0}0A0z0K0A0N1!0A0x12050/0H0N0o1V0`0|011Z1#1%1#0x1-1/1+0x0H0F0J1c1,0U1I0x0A0@1f0b0R0k0j0}0s011;1X010f0;0o0j1n0o1+2c2e2j1?2m1/2p0n2r040a0i0q0U0F0R0F0b0z1i1k0-2a0U0U0o0I2M1A2t0j1I0L282Y0x2625270J2v0}1%0j2o2J1+1S1U0^1=2,0z2.0j221T1+0R2R1I2W2Y33152d1k2@2k2|0U190N120m2V3713362u391?3b3d120s3h2e3j2W2+013o0k3e040c3s2X143v3m0}3y3A0t3D3u373w3J120(3M3F3O3H3x0F3c3z120D3M1J311A2=2#0J2)3w0I222B0,1T1I300o323i3%3:0-3{3l1W1?0#120-0f3%3G420}0y120i483V4a3x0f120b0F180o0d0I1Z0f0f2R1z1B3|492^0111040p4f414z0j120j4E384h4B0C0u3T0i4R4e4y3a4k4m2A3M4T4g4z0F120Y4Z3k4L4z0n0z120M4Q4S4+3w44040y1Z1/4*4U3n4I4~4#2k4%04020K0x0G524F2k4.4:4K3w4B4P4w3t064S5n4!5c50044l4n5b4,544(5v3P4W5u5k2X5p5w1?550Z5z3W4H044J5D045F3w550$5K4h5e040m4;5P5m5o4R4@5L515P5R3W554)5,5)4h5M5O335-4h550L0L5V4-4/5Y5!335$5(4 0}4_2R0x0e0U5^3i5`4G5B4Y5#1A3~3`3(6n0L3+1A0x3-6s2%2Z21232#0k1.6p3+1G405G0}2R0n0d0f0k0#4o0A0c121s1u1w1y0i5j351N3j1H2F2/0j0?0e1k0o0*1t0R1/6X0i0k2m2N1:0I3z0I0e1/0U0i0_0i5t2A0i0-0?4q0z4s4u761:5=4z1a2L0A190x6-12090p0t0M0%090C4Z1j760F2L6?0J1S2M2.706;797b1:770i6+2L0+0?7f2k7h287k7m047o7s7u5P0X0@0o1g0z7d0?1S0!0:2.7P67017S7j0k7l0*7n0p0M7t4Z0.7$7(7*7$0j0/2`6W7Q1?7?7U7`7W7p7~5P0T1J6#040V6`4r4t7J6W7M0x7O0i0g0k1h6g7R0U7i8c7{7Y3M0T0i0v001y0x711:4u7l7d710k761T0z2K7w2O890}8b7^7V7o7q8F5,2d708!7=8B7T8%8d7o5Z8g338H0E1k0N000F0H0 2o8M2o2E0h287w966M8W2e8M056m048*0i0$0i5Z6l3;048i6!6F0v6`6|6~0i0o4s2S6b0+7#7w6{0N6}6;6;1w0F93858R8/8$7_7{8*8`6f8-8z8a8;7@9S8e8_7Z5_0u0i7w919N9f7;9R8(7p7}9)3i8|8~90920z949y1k0q980A9a1k9c0b9e4e9h9j5}9m5!9h9r1Q1L048}0i0R0o8y3z3Y0?2R3:4n0j0I0o7F8T0J0+1u4q1:0p8P8q8S8U0g8W0z7w168VaJ9L9/0C0i0w0e0b1w000O7$0i6V8Na(0e9M9 9O4l7z0j6~ai3j1}3`14280o0k3-a{26a{290b0x0h1/0}7_0x0W3z1!0j9+ay85az0G120B0/ao6s0Aa^b3b5b70~6-babc0Kbe847l0Ubj040r3zap708Z9;9!8D8e0j9V3tbobq73bs0ob8bvbb1`bzbgbBbD1sb4aJ722=aN7w9X9QbL8?7{9(3%2Zbpb2bTb6bVbu0*bwbZbf94bi120Sa,9/8Rb+8V8X1kb/bK8Cb=9%9^b^2!142Zb1boa}a 1,6y1F2(a{2*b4b}bWc0bYbdc3bhbC3f6scs6tb|btb9cDbycFb$2s539Zch9$8)7rbP2XcJa^cybUcBc1cEbAc56G3w9=8@0p8+6Z6tc%cMb~cObxb!c4cHc/3Wc;9Tck5Pc$cn2$a^cpcLczcNbXc~cRc.3r2ZcKc(cAb c+cQc-d1b:cW9?7qc!3,c`dec|dgc2dsbDdu8=cX7|dyd81,dndfcCdhdFcT5q8#b;dJ0tdLdl3jcodbdAc)dpcPc cGbD3Cd!cxc{c*d+didtcgdIdwdZc_d;dBd?dRb#c.dH9#d|9_bQd:dNd=d*e2d0dGd`e6c=d6c^csd$d9cud#a_8k0V8T0f1j2TaO1k9g9p744o7H8p4v9h9yb47xax2a6)2$0e2L1:8x0x0F6c76006+1:210e0^1:2|0j0W216d0+aGeA3 4{2n9o3 aV0b8O0+0R0+0/9Oe~8Ma)e/3`5OeH8L0ie(f8a?8j6F0Q0@0A0ka)7N0U7^ey9,1k0k0weU8Q6;aI0ia$728w8B6B6;f35s4X0oe?3`9y8M8 7w6J6:0kayaK8w1/eV8Z9hf59pan1a737waTa.8Mb/6m3w1^1$1(1*d25W619nd70Lahfcakam2R0j0g7y1:fxbGfT7e9heCfG9qf`6q0.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

.128013s3_ufvy naS1me(PV24:CjtwihE)6Oo;bcdg/0làqApQ.rL-,=+zk%95Rxé050J0o0x0k0z0N0b0i0I0N0k0b0b0Y010x0z0R010406050b0e0n0n0k0U0h040l0F0N0e0 0F0j0i020k0n0R0G0i0)0o190U0P0e0o0b050L16181a1c140R041A1H051K0L1K1M1H140J0z0g0@0_0{0}0A0z0K0A0N1!0A0x12050/0H0N0o1V0`0|011Z1#1%1#0x1-1/1+0x0H0F0J1c1,0U1I0x0A0@1f0b0R0k0j0}0s011;1X010f0;0o0j1n0o1+2c2e2j1?2m1/2p0n2r040a0i0q0U0F0R0F0b0z1i1k0-2a0U0U0o0I2M1A2t0j1I0L282Y0x2625270J2v0}1%0j2o2J1+1S1U0^1=2,0z2.0j221T1+0R2R1I2W2Y33152d1k2@2k2|0U190N120m2V3713362u391?3b3d120s3h2e3j2W2+013o0k3e040c3s2X143v3m0}3y3A0t3D3u373w3J120(3M3F3O3H3x0F3c3z120D3M1J311A2=2#0J2)3w0I222B0,1T1I300o323i3%3:0-3{3l1W1?0#120-0f3%3G420}0y120i483V4a3x0f120b0F180o0d0I1Z0f0f2R1z1B3|492^0111040p4f414z0j120j4E384h4B0C0u3T0i4R4e4y3a4k4m2A3M4T4g4z0F120Y4Z3k4L4z0n0z120M4Q4S4+3w44040y1Z1/4*4U3n4I4~4#2k4%04020K0x0G524F2k4.4:4K3w4B4P4w3t064S5n4!5c50044l4n5b4,544(5v3P4W5u5k2X5p5w1?550Z5z3W4H044J5D045F3w550$5K4h5e040m4;5P5m5o4R4@5L515P5R3W554)5,5)4h5M5O335-4h550L0L5V4-4/5Y5!335$5(4 0}4_2R0x0e0U5^3i5`4G5B4Y5#1A3~3`3(6n0L3+1A0x3-6s2%2Z21232#0k1.6p3+1G405G0}2R0n0d0f0k0#4o0A0c121s1u1w1y0i5j351N3j1H2F2/0j0?0e1k0o0*1t0R1/6X0i0k2m2N1:0I3z0I0e1/0U0i0_0i5t2A0i0-0?4q0z4s4u761:5=4z1a2L0A190x6-12090p0t0M0%090C4Z1j760F2L6?0J1S2M2.706;797b1:770i6+2L0+0?7f2k7h287k7m047o7s7u5P0X0@0o1g0z7d0?1S0!0:2.7P67017S7j0k7l0*7n0p0M7t4Z0.7$7(7*7$0j0/2`6W7Q1?7?7U7`7W7p7~5P0T1J6#040V6`4r4t7J6W7M0x7O0i0g0k1h6g7R0U7i8c7{7Y3M0T0i0v001y0x711:4u7l7d710k761T0z2K7w2O890}8b7^7V7o7q8F5,2d708!7=8B7T8%8d7o5Z8g338H0E1k0N000F0H0 2o8M2o2E0h287w966M8W2e8M056m048*0i0$0i5Z6l3;048i6!6F0v6`6|6~0i0o4s2S6b0+7#7w6{0N6}6;6;1w0F93858R8/8$7_7{8*8`6f8-8z8a8;7@9S8e8_7Z5_0u0i7w919N9f7;9R8(7p7}9)3i8|8~90920z949y1k0q980A9a1k9c0b9e4e9h9j5}9m5!9h9r1Q1L048}0i0R0o8y3z3Y0?2R3:4n0j0I0o7F8T0J0+1u4q1:0p8P8q8S8U0g8W0z7w168VaJ9L9/0C0i0w0e0b1w000O7$0i6V8Na(0e9M9 9O4l7z0j6~ai3j1}3`14280o0k3-a{26a{290b0x0h1/0}7_0x0W3z1!0j9+ay85az0G120B0/ao6s0Aa^b3b5b70~6-babc0Kbe847l0Ubj040r3zap708Z9;9!8D8e0j9V3tbobq73bs0ob8bvbb1`bzbgbBbD1sb4aJ722=aN7w9X9QbL8?7{9(3%2Zbpb2bTb6bVbu0*bwbZbf94bi120Sa,9/8Rb+8V8X1kb/bK8Cb=9%9^b^2!142Zb1boa}a 1,6y1F2(a{2*b4b}bWc0bYbdc3bhbC3f6scs6tb|btb9cDbycFb$2s539Zch9$8)7rbP2XcJa^cybUcBc1cEbAc56G3w9=8@0p8+6Z6tc%cMb~cObxb!c4cHc/3Wc;9Tck5Pc$cn2$a^cpcLczcNbXc~cRc.3r2ZcKc(cAb c+cQc-d1b:cW9?7qc!3,c`dec|dgc2dsbDdu8=cX7|dyd81,dndfcCdhdFcT5q8#b;dJ0tdLdl3jcodbdAc)dpcPc cGbD3Cd!cxc{c*d+didtcgdIdwdZc_d;dBd?dRb#c.dH9#d|9_bQd:dNd=d*e2d0dGd`e6c=d6c^csd$d9cud#a_8k0V8T0f1j2TaO1k9g9p744o7H8p4v9h9yb47xax2a6)2$0e2L1:8x0x0F6c76006+1:210e0^1:2|0j0W216d0+aGeA3 4{2n9o3 aV0b8O0+0R0+0/9Oe~8Ma)e/3`5OeH8L0ie(f8a?8j6F0Q0@0A0ka)7N0U7^ey9,1k0k0weU8Q6;aI0ia$728w8B6B6;f35s4X0oe?3`9y8M8 7w6J6:0kayaK8w1/eV8Z9hf59pan1a737waTa.8Mb/6m3w1^1$1(1*d25W619nd70Lahfcakam2R0j0g7y1:fxbGfT7e9heCfG9qf`6q0.0:0=04.
Question 2 : nombres harshad

Vous devez écrire une fonction harshad prenant en paramètre un nombre entier strictement positif n et renvoyant True si n est un nombre harshad et False sinon.

Vous pouvez utiliser la fonction somme_chiffres même si vous n'avez pas réussi à traiter la question précédente. Cette fonction est chargée automatiquement pour cette question.

Tester si un nombre est divisible par un autre

On rappelle qu'un nombre \(a\) est divisible par \(b\) si le reste de la division euclidienne de \(a\) par \(b\) est 0.

Exemples

>>> harshad(18)
True
>>> harshad(72)
True
>>> harshad(11)
False

###(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

.128013s3o_;bcdufvg/0lyàq napS.r1Lmeh,(P2=:twk%iR)é050i0D0L0v0P0p0b0t0h0p0v0b0b0J010L0P0w010406050b0j0C0C0v0z0q040x0d0p0j0-0d0u0t020v0C0w0f0t0Q0D0`0z0s0j0D0b050n0@0_0{0}0=0w041l1s051v0n1v1x1s0=0i0P0l0#0%0)0+0E0P0m0E0p1L0E0L0:050W0g0p0D1G0(0*011K1M1O1M0L1U1W1S0L0g0d0i0}1T0z1t0L0E0#100b0w0v0u0+0I011Y1I010k0Y0D0u180D1S1}1 241!271W2a0C2c040a0t0H0z0d0w0d0b0P13150U1{0z0z0D0h2x1l2e0u1t0n1_2J0L1@1?1^0i2g0+1O0u292u1S1D1F0$1Z2T0P2V0u1:1E1S0w2C1t2H2J2;0?1~152#252*0z0`0p0:0A2G2^0;2@2f2`1!2|2~0:0I321 2J2.0D2J2Z2M0i2Q2S010h1:2m0T1E1t3g2:333d2I053p0U3w361H1!0N0:0U0k3y3D2_3F0+0M0:0t3L353N2$010u0k0:0E0{0b3#0i3T2H3n0/040G3*2^3n0u0:0u3:3E3W3-0R0K3L060t413S3+370+3H042C0L0j0z3^1m33433;453X3@3L4g3`250d0:0O4l3U3=0:0b0d0_0D0e0h1K0k0k2C1k4e3e4t4i3-3/4H3z443O4j044d2?4P3{0:0R4s4V4o0:0J0J4Z4h4Q0C0P0:0o3 1l3B3h1u2/1l3j1l0L3l4{2O2K1/1;2M0v1V4?0n3j1r3M3n2C0C0e0k0v0N4z0E0c0:1d1f1h1j0t3~4N3f341s0B0v0t0k142E0P143S4=043#0z3%0v3)0n5F0t1j0L0t2v191W5q0t5D0b1X3p0u0L295$0t2z5$0b5$0z5R0P0t5U4F5(2z0%5)1E0P2v5D2z3A3q4S4;610t1~5.603C4w4y4A4C4E1j0G0u4Y5M645P0t0S0m0v0p0t0r5E3q3n1$1N1P1R5a4i4,4.3T6j3C0y060x5:0d0j0P0F5;1X2*0C0g2C5O5,3S1e5G3$3(1l6Y6O2v0t2*150Y6*1X0p006l1~0b0y1u34570V0X0Z04.