Cyprein JULLIEN PREPA ISIMA UCA
The River est une séquence de nombres où chaque nombre est suivi du même nombre plus la somme de ses chiffres. Dans une telle séquence, 123 est suivi de 129 (puisque 1 + 2 + 3 = 6), qui est à nouveau suivi de 141.
RIVER I.
Le but de l’exercice est de coder un programe en C, qui permet de donner le point de rencontre de deux “rivière” avec comme input deux nombres.
RIVER II.
Le but de l’exercice est de coder un programe en C, qui permet de dire si oui ou non il est possible qu’une “rivière” à un point de rencontre avec une autre “rivière” avec comme input un seul nombre.
RIVER I.
Voici mon code en C:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
//je crée une fonction qui me permet de calculer le prochain terme à partir d'un nombre
//l'utilisation d'un long long est nécessaire pour prendre en charge n'importe qu'elle valeur sans dépassement de capacité
int calcul_du_prochain(long long tmpR)
{
long long somme=tmpR;
//j'applique le raisonnement de la river
//pour ça j'utilise le modulo 10 pour obtenir la veuleur de l'unité
//puis un / 10 pour réduire la dizaine en unité
while(tmpR!=0)
{
+=tmpR % 10;
somme=tmpR/10;
tmpR
}
return somme;
}
int main()
{
//j'initialise mes deux long long
long long r_1;
("%lld", &r_1);
scanf
long long r_2;
("%lld", &r_2);
scanf
//je boucle jusqu'a trouver un point de section
while(r_1!=r_2)
{
//je calcule le prochaion terme de la plus petite valeur
if(r_1<r_2)
{
= calcul_du_prochain(r_1);
r_1}
else
{
=calcul_du_prochain(r_2);
r_2}
}
("%d\n",r_1);
printf
return 0;
}
RIVER II.
Voici mon code en C:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
//je crée une fonction qui me permet de calculer le prochain terme à partir d'un nombre
//l'utilisation d'un long long est nécessaire pour prendre en charge n'importe qu'elle valeur sans dépassement de capacité
int calcul_du_prochain(long long tmpR)
{
long long somme=tmpR;
//j'applique le raisonnement de la river
//pour ça j'utilise le modulo 10 pour obtenir la veuleur de l'unité
//puis un / 10 pour réduire la dizaine en unité
while(tmpR!=0)
{
+=tmpR % 10;
somme=tmpR/10;
tmpR
}
return somme;
}
int main()
{
//j'initialise un long long et un int rep qui servira de booléen
int r_1;
int rep=0;
("%d", &r_1);
scanf
for(int i =1; i<r_1 ;i++)
{
//test si on trouve un point commun entre r_1 et le prochain terme de i
if(calcul_du_prochain(i)==r_1)
{
//si egal alors rep passe equivalent True
=1;
rep}
}
//Selon la valeur de rep print oui ou non
if(rep)
{
("YES\n");
printf}
else
{
("NO\n");
printf}
return 0;
}
RIVER I.
Le programme fonctione bien mais peut tourner à l’infini si les deux “rivière” n’ont paas de point commun. > RIVER II.
Le programme fonctionne mais peut faire beaucoup d’itération pour un rien si la valeur est trop importante.
RIVER I.
Dans la solution de xerneas02, il utilise le même raisonnement que le mien mais il inverse r_1 et r_2 si r_1 ets supérieur à r_2. Ce qui m’as marqué dans son code c’est le fait qu’il contourne un if else par l’inversion de r_1 et r_2.
#include <stdio.h>
int main()
{
int r_1, r_2, i, somme;
("%d %d", &r_1, &r_2);
scanfwhile(r_1 != r_2){
if(r_1 > r_2){
+= r_2;
r_1 = r_1 - r_2;
r_2 -= r_2;
r_1 }
= 0;
somme
for(i = 10; i <= r_1*10 ; i=i*10)
+= (int)((r_1%i)/(i/10));
somme
+= somme;
r_1 }
("%d", r_1);
printfreturn 0;
}
Solution de xerneas02
RIVER II.
Dans la solution de McKael, il utilise le même raisonnement que le mien mais il parcours les valeurs de 0 à r1 dans le sens inverse, je trouve ceci bien pensée, puisqu’il trouvera surement la bonne valeur plus rapidement si le nombre de départ est plus grand.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int next(int i) {
int n = i;
for (; i > 0; i/=10)
+= i % 10;
n return n;
}
int main()
{
int r1;
("%d", &r1);
scanf
for (int d = r1 - 1; d > 0; d--) {
if (next(d) == r1) {
("YES\n");
printfreturn 0;
}
}
("NO\n");
printf
return 0;
}
Solution de McKael
J’ai appris à utiliser les long long en c, afin de ne pas avoir de dépassement de capacité.
retour au Hub