The River I + The River II

Cyprein JULLIEN PREPA ISIMA UCA

logo

river

Introduction

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.

But:

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.

Description synoptique de ma méthode de résolution

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)
    {
        somme+=tmpR % 10;
        tmpR=tmpR/10;

    }
    return somme;
}

int main()
{
    //j'initialise mes deux long long 
    long long r_1;
    scanf("%lld", &r_1);

    long long r_2;
    scanf("%lld", &r_2);

    //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)
        {
           r_1= calcul_du_prochain(r_1);
        }
        else
        {
            r_2=calcul_du_prochain(r_2);
        }
    }
  
    printf("%d\n",r_1);

    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)
    {
        somme+=tmpR % 10;
        tmpR=tmpR/10;

    }
    return somme;
}

int main()
{
    //j'initialise un long long et un int rep qui servira de booléen
    int r_1;
    int rep=0;

    scanf("%d", &r_1);


    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
            rep=1;
        }

    }

    //Selon la valeur de rep print oui ou non
    if(rep)
    {
        printf("YES\n");
    }
    else
    {
        printf("NO\n");
    }

    return 0;
}

Analyse des résultats

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.

Autre solutions

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;
    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;
}

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)
        n += i % 10;
    return n;
}
int main()
{
    int r1;
    scanf("%d", &r1);

    for (int d = r1 - 1; d > 0; d--) {
        if (next(d) == r1) {
            printf("YES\n");
            return 0;
        }
    }
    printf("NO\n");

    return 0;
}

Solution de McKael

Bilan

J’ai appris à utiliser les long long en c, afin de ne pas avoir de dépassement de capacité.

retour au Hub