I- Présentation du problème
A) Les entrées
En entrée, nous avons 2 entiers qui correspondent au début des deux rivières.
B) Le but du jeu
Une rivière numérique 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 lui-même suivi de 141.
Nous appelons une rivière numérique rivière K , si elle commence par la valeur K.
Par exemple, la rivière 7 est la séquence commençant par {7, 14, 19, 29, 40, 44, 52, ... } et la rivière 471 est la séquence commençant par {471, 483, 498, 519, ... }.
Les rivières numériques peuvent se rencontrer. Cela se produit lorsque deux rivières numériques partagent les mêmes valeurs. La rivière 32 rencontre la rivière 47 à 47, tandis que la rivière 471 rencontre la rivière 480 à 519.
C) La sortie
Étant donné deux rivières numériques qui se rencontrent on doit imprimer le point de rencontre.
II- Ma méthode de résolution
A) Approche synoptique
Pour résoudre ce problème, j'ai utilisé des divisions entières et les restes des divisions pour me permettre d'accéder à chaque chiffre d'un nombre, cela m'a permis d'additionner le nombre et ses chiffres. Puis pour déterminer la rivière, j'ai toujours travaillé avec le plus petit des deux nombres pour arriver à un nombre correspondant au deux rivières.
B) Appproche algorithmique et explication de mon programme
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
long long somme(long long nb){
long long somme=nb;
while (nb!=0){
somme+=nb%10;
nb=nb/10;
}
return somme;
}
int main(){
long long r_1,r_2;
scanf("%lld", &r_1);
scanf("%lld", &r_2);
while (r_1!=r_2){
if (r_1<r_2){
r_1 = somme(r_1);
}
else{
r_2=somme(r_2);
}
}
printf("%lld\n",r_1);
return 0;
}
Pour ce programme, j'ai utilisé une fonction annexe. La fonction somme est de type long long et elle prend un seul argument qui est nb de type aussi long long et elle va retourner un nombre de type long long également. Concernant cette fonction, il n'y a pas d'effets de bords, en effet cette fonction ne sert qu'à trouver le nombre suivant de la rivière. Pour cela, on initialise une variable somme de type long long qui est égale au nombre de départ, puis on entre dans une boucle while tant que le nombre en est différent de 0. On va à chque passage dans la boucle faire une division du nombre par 10 ce qui va nous permettre d'additioner le reste avec la valeur contenue dans la variable somme, puis on remplace le nombre par le nombre auquel nous avons supprimé le chiffre des unités en effectuant une division entière par 10. La fonction retourne ensuite le résultat contenu dans la variable somme.
La fonction main quand à elle, sert d'abord à demander les deux rivières dont on veut trouver les intersections puis de déterminer cette intersection à l'aide de la fonction implémentée au dessus. J'initialise donc deux variables r_1 et r_2 de type long long puis je demande leur valeur à l'utilisateur. Je rentre ensuite dans la boucle while qui s'arrètera uniquement si r_1 est égale à r_2 qui dans ce cas la renverra r_1 corresmondant à 'lintersection des deux rivières. Dans la boucle while, je choisis le plus petit des deux nombres et je le remplace par le nombre suivant (dans la rivière) calculer en appelant la fonction somme, en faisant de cette manière, il y a forcèment un nombre pour lequel r_1 est égale à r_2. Le porgramme écrit donc l'intersection des deux rivières lorsque la condition du while n'est plus vérifiée.
III- Un autre programme
int s(int n) {
return n ? n % 10 + s( n / 10 ) : 0 ;
}
main(r1, r2) {
if ( r1 == 1 ) scanf("%d %d", &r1, &r2);
if ( r1 == r2 ) printf("%d", r1);
if ( r1 > r2 ) main ( r1 , r2 + s(r2) );
if ( r1 < r2 ) main ( r1 + s(r1) , r2 );
}
Le programme que j'ai sélectionné m'a tapé dans l'oeil car il est assez court mais en même temps très clair, il crée une fonction qui lui permet de déterminer le nombre suivant dans la rivière. Ensuite dans son main, il demande d'abord de rentrer les deux rivières dont on veut connaitre l'intersection, puis il fait suivre 3 autres conditions permettant d'afficher l 'intersection quand les deux nombres sont égaux et les deux dernières permettent de calculer le nombre suivant du nombre le plus petit entre les deux rivières. Il est donc simple, court et assey efficace sans action inutile.
IV- Bilan / Retour d'expérience
Dans le programme que j'ai écrit je n'ai rien appris de vraiment super important, j'ai néanmoins vu le fait de déclarer une variable en type long long et de saisir sa valeur à l'aide de %lld. J'ai aussi utilisé un while que je n'avais pas encore vu en cours, mais je me suis appuyé sur le cours de C.
En ce qui concerne le programme d'un autre codeur, j'ai appris à utilisé la syntaxe suivante: condition ? ifVraie : ifFaux qui peut s'avérer très utile pour remplacer un if suivi d'un else par exemple. J'ai appris que l'on pouvait ne pas déclarer de type pour la fonction main, ce qui a pour effet notamment de ne pas avoir à retoruner quelque chose.