New
Écrivez un programme C calculant les termes de la suite ci-dessous, jusqu'à ce qu'elle converge. Le premier terme est un entier aléatoire de quatre chiffres avec au moins deux chiffres distincts. Chaque nouveau terme n s'obtient du précédent p de la façon suivante : soit le nombre a construit en classant les chiffres de p par ordre croissant, et le nombre b construit en classant les chiffres de p par ordre décroissant, n est la différence max(a,b)-min(a,b). Par exemple, pour le terme p=1492, le suivant est obtenu comme 9421-1249, soit n=8172.
Feb 20, 8:56am

Voici un programme en C qui calcule les termes de la suite décrite jusqu'à ce qu'elle converge. Le programme génère un nombre aléatoire de quatre chiffres avec au moins deux chiffres distincts, puis applique les règles données pour générer les termes suivants jusqu'à ce que la suite converge.

c
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> // Fonction pour vérifier si un nombre a au moins deux chiffres distincts bool hasTwoDistinctDigits(int number) { int digits[10] = {0}; while (number > 0) { digits[number % 10]++; number /= 10; } int distinctCount = 0; for (int i = 0; i < 10; i++) { if (digits[i] > 0) { distinctCount++; if (distinctCount >= 2) { return true; } } } return false; } // Fonction pour générer un nombre aléatoire de quatre chiffres avec au moins deux chiffres distincts int generateRandomNumber() { int number; do { number = 1000 + rand() % 9000; // Génère un nombre entre 1000 et 9999 } while (!hasTwoDistinctDigits(number)); return number; } // Fonction pour classer les chiffres d'un nombre par ordre croissant int sortAscending(int number) { int digits[4]; for (int i = 0; i < 4; i++) { digits[i] = number % 10; number /= 10; } for (int i = 0; i < 3; i++) { for (int j = i + 1; j < 4; j++) { if (digits[i] > digits[j]) { int temp = digits[i]; digits[i] = digits[j]; digits[j] = temp; } } } return digits[0] * 1000 + digits[1] * 100 + digits[2] * 10 + digits[3]; } // Fonction pour classer les chiffres d'un nombre par ordre décroissant int sortDescending(int number) { int digits[4]; for (int i = 0; i < 4; i++) { digits[i] = number % 10; number /= 10; } for (int i = 0; i < 3; i++) { for (int j = i + 1; j < 4; j++) { if (digits[i] < digits[j]) { int temp = digits[i]; digits[i] = digits[j]; digits[j] = temp; } } } return digits[0] * 1000 + digits[1] * 100 + digits[2] * 10 + digits[3]; } // Fonction pour calculer le terme suivant de la suite int nextTerm(int number) { int a = sortAscending(number); int b = sortDescending(number); return b - a; } int main() { srand(time(NULL)); // Initialise le générateur de nombres aléatoires int currentTerm = generateRandomNumber(); printf("Premier terme : %d\n", currentTerm); while (true) { int next = nextTerm(currentTerm); printf("Terme suivant : %d\n", next); if (next == currentTerm) { break; } currentTerm = next; } return 0; }

Explication du programme :

  1. Génération d'un nombre aléatoire : La fonction generateRandomNumber génère un nombre aléatoire de quatre chiffres avec au moins deux chiffres distincts.
  2. Vérification des chiffres distincts : La fonction hasTwoDistinctDigits vérifie si un nombre a au moins deux chiffres distincts.
  3. Tri des chiffres : Les fonctions sortAscending et sortDescending trient les chiffres d'un nombre par ordre croissant et décroissant respectivement.
  4. Calcul du terme suivant : La fonction nextTerm calcule le terme suivant de la suite en utilisant les règles données.
  5. Boucle principale : Le programme génère le premier terme, puis calcule les termes suivants jusqu'à ce que la suite converge (c'est-à-dire que le terme suivant est égal au terme actuel).

Ce programme affiche chaque terme de la suite jusqu'à ce qu'elle converge.

Feb 20, 8:56am
Est-ce qu'on peut être sûr que la suite va converger ?
Feb 20, 8:59am

Oui, on peut être sûr que la suite va converger. Voici pourquoi :

  1. Monotonie : La suite est monotone décroissante. En effet, chaque nouveau terme est obtenu en soustrayant deux nombres (le nombre formé par les chiffres triés par ordre croissant et le nombre formé par les chiffres triés par ordre décroissant). Cette différence est toujours inférieure ou égale au terme précédent.

  2. Bornes inférieures : Les termes de la suite sont des entiers positifs. La suite ne peut donc pas descendre indéfiniment, car elle est bornée inférieurement par zéro.

  3. Convergence vers un palindrome : Lorsque la suite atteint un palindrome (un nombre qui se lit de la même manière dans les deux sens, comme 6174, 1089, etc.), le terme suivant sera le même que le terme actuel, car les chiffres triés par ordre croissant et décroissant seront identiques. Par exemple, pour le nombre 6174, les chiffres triés par ordre croissant donnent 1467 et par ordre décroissant donnent 7641, et la différence 7641 - 1467 = 6174.

  4. Propriété de Kaprekar : La suite de Kaprekar pour les nombres à quatre chiffres converge toujours vers 6174, sauf pour les nombres comme 1111, 2222, etc., qui sont des palindromes dès le départ. Dans le cas de notre programme, nous avons garanti que le premier terme a au moins deux chiffres distincts, ce qui exclut ces cas particuliers.

En résumé, la suite est monotone décroissante, bornée inférieurement par zéro, et converge vers un palindrome (le plus souvent 6174 pour les nombres à quatre chiffres). Par conséquent, la suite va nécessairement converger.

Feb 20, 8:59am

This Chat is read-only. Login to resume chatting.

#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> // Fonction pour vérifier si un nombre a au moins deux chiffres distincts bool hasTwoDistinctDigits(int number) { int digits[10] = {0}; while (number > 0) { digits[number % 10]++; number /= 10; } int distinctCount = 0; for (int i = 0; i < 10; i++) { if (digits[i] > 0) { distinctCount++; if (distinctCount >= 2) { return true; } } } return false; } // Fonction pour générer un nombre aléatoire de quatre chiffres avec au moins deux chiffres distincts int generateRandomNumber() { int number; do { number = 1000 + rand() % 9000; // Génère un nombre entre 1000 et 9999 } while (!hasTwoDistinctDigits(number)); return number; } // Fonction pour classer les chiffres d'un nombre par ordre croissant int sortAscending(int number) { int digits[4]; for (int i = 0; i < 4; i++) { digits[i] = number % 10; number /= 10; } for (int i = 0; i < 3; i++) { for (int j = i + 1; j < 4; j++) { if (digits[i] > digits[j]) { int temp = digits[i]; digits[i] = digits[j]; digits[j] = temp; } } } return digits[0] * 1000 + digits[1] * 100 + digits[2] * 10 + digits[3]; } // Fonction pour classer les chiffres d'un nombre par ordre décroissant int sortDescending(int number) { int digits[4]; for (int i = 0; i < 4; i++) { digits[i] = number % 10; number /= 10; } for (int i = 0; i < 3; i++) { for (int j = i + 1; j < 4; j++) { if (digits[i] < digits[j]) { int temp = digits[i]; digits[i] = digits[j]; digits[j] = temp; } } } return digits[0] * 1000 + digits[1] * 100 + digits[2] * 10 + digits[3]; } // Fonction pour calculer le terme suivant de la suite int nextTerm(int number) { int a = sortAscending(number); int b = sortDescending(number); return b - a; } int main() { srand(time(NULL)); // Initialise le générateur de nombres aléatoires int currentTerm = generateRandomNumber(); printf("Premier terme : %d\n", currentTerm); while (true) { int next = nextTerm(currentTerm); printf("Terme suivant : %d\n", next); if (next == currentTerm) { break; } currentTerm = next; } return 0; }