Page web ISIMA
Fichier .md source

SCHIRRA Rémi Prep ISIMA 1 - 2023-2024

Défi de programmation - The River I


Introduction

Le problème propose The River I consiste en trouver l’intersection de deux suites, quand est-ce que leur valeur sont égales.
Une rivière digitale est définie en fonction d’un chiffire k, pour laquelle le chiffre suivant est la valeur de k à laquelle on ajoute la somme des chiffres composant k.

Approche utilisée

Description synoptique

Les deux rivières sont représentées par des suites, on sait que les suites sont strictement croissante (on admet k > 0).
Les suites étant croissante, pour chercher l’intersection, on avance sur la rivière possédant la plus petite valeur, espérant que le nouveau terme soit égal à la valeur de l’autre rivière.

Algorithme

rivière1 = nombre entré par l’utilisateur
rivière2 = nombre entré par l’utilisateur
Tant que rivière1 \(\neq\) rivière2 :

Fin boucle

Résolution

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

// fonction calculant la somme des chiffres d'un nombre
int sum(int num) {
    int sum = 0;
    while (num != 0) {
        sum += num % 10;
        num /= 10;
    }
    return sum;
}

int main()
{
    long long r_1;
    scanf("%lld", &r_1);
    long long r_2;
    scanf("%lld", &r_2);

    // Conversion en entier
    int current_1 = (int) r_1;
    int current_2 = (int) r_2;
    
    while (current_1 != current_2) {
        // Si la valeur actuelle de river 1 < celle de river 2, on continue de 
        // parcourir river 1, sinon on parcours river 2
        // On continue jusqu'à ce que la valeur actuelle des 2 rivières soient égales
        if (current_1 > current_2) {
            current_2 += sum(current_2);
        }
        else {
            current_1 += sum(current_1);
        }
    
    }

    printf("%d\n", current_1);

    return 0;
}

Comparaison avec une autre solution

A partir de cette solution externe :

#include <stdio.h>

int main()
{
    int r_1, r_2, i, somme;
    scanf("%d %d", &r_1, &r_2);
    while(r_1 != r_2){
        if(r_1 > r_2){
            r_1 += r_2;
            r_2 = r_1 - r_2;
            r_1 -= r_2;
        }
        somme = 0;
        
        for(i = 10; i <= r_1*10 ; i=i*10)
            somme += (int)((r_1%i)/(i/10));
        
        r_1 += somme;
    }
    printf("%d", r_1);
    return 0;
}

J’ai aimé cette solution car au lieu d’effectuer des opérations en fonction de si r_1 > r_2 ou r_2 < r_1, les deux valeurs sont échangées afin de s’assurer que r_1 < r_2 et ensuite calcule le terme suivant de r_1.
J’ai aimé le fait que les deux valeurs soient échangées sans utiliser de variable intermédiaires.
Cette solution propose également un calcul pour la somme des chiffres similaire mais différent du mien, le mien est moins compacte et utilise une variable intermédiaire en plus.

Bilan

Après avoir analyser le problème, je l’ai trouvé plutôt simple à résoudre et je n’ai pas rencontré de difficultés.