Уменьшить каждую цифру в записи числа на единицу и вернуть количество цифр - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дана последовательность из n натуральных чисел. Для каждого числа исходной последовательности уменьшить каждую цифру в записи числа на единицу(вместо 0 записать 9) и подсчитать количество цифр в записи числа. Сформировать новую последовательность, поместив в нее преобразованные числа исходной последовательности . Упорядочить полученную последовательность по убыванию количества цифр в записи каждого числа. Вывести исходную последовательность на экран. В программе использовать функцию, которая уменьшает каждую цифру в записи числа на единицу и возвращает количество цифр в записи числа . (Реализовать в си). Народ помогите , хотя бы с минимальными коментами

Решение задачи: «Уменьшить каждую цифру в записи числа на единицу и вернуть количество цифр»

textual
Листинг программы
/*
 ============================================================================
 Name        : trash.c
 Author      : 
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */
 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct nm {
    int n;
    int s;
};
int rebuild(int x);
int cnt(int x);
void insertSort(struct nm* a, int size);
void print(struct nm* a, int size);
 
int main(void) {
    const int n = 10;
    struct nm num[10];
    int i = 0;
    // заполняем
    srand(time(0));
    for (i = 0; i < n; ++i) {
        num[i].n = rand() % 100000;
        num[i].s = cnt(num[i].n);
    };
    // печатаем
    print(num, n);
    // меняем
    for (i = 0; i < n; ++i) {
        num[i].n = rebuild(num[i].n);
        num[i].s = cnt(num[i].n);
    }
    // сортируем
    insertSort(num, n);
    // печатаем
    print(num, n);
    return EXIT_SUCCESS;
}
 
int rebuild(int x) {
    int n = x, m = 0;
    int p = 1;
    x ^= x;
    do {
        m = n % 10; /* цифра */
        m = (m != 0) ? --m : 9;
        x += m * p;
        //printf("\n %d, %d %d %d\n", m, n, *x, p);
        p *= 10;
        n /= 10; /* следующий разряд*/
    } while (n);
    return x;
}
int cnt( int x) {
    int count = 0;
    do {
        count++;
        x /= 10;
    } while (x);
    return count; // возвращаем число цифр
}
;
 
void insertSort(struct nm * a, int size) {
    int i, j, tmpn, tmps;
    // цикл проходов, i - номер прохода
    for (i = 1; i < size; ++i) {
        tmps = a[i].s;
        tmpn = a[i].n;
        // поиск места элемента в готовой последовательности
        for (j = i - 1; j >= 0 && a[j].s < tmps; --j) {
            // сдвигаем элемент направо, пока не дошли
            a[j + 1].s = a[j].s;
            a[j + 1].n = a[j].n;
        }
        a[j + 1].s = tmps; // место найдено, вставить элемент
        a[j + 1].n = tmpn;
    }
}
void print(struct nm* a, int size) {
    int i = 0;
    for (i = 0; i < size; ++i) {
        if (!i)
            printf("\n");
        printf("%6d", a[i].n); // old
    };
    for (i = 0; i < size; ++i) {
        if (!i)
            printf("\n");
        printf("%6d", a[i].s); // old
    };
}

Объяснение кода листинга программы

Код представляет собой программу на языке C, которая выполняет следующие действия:

  1. Задаёт проблему: уменьшение каждой цифры в записи числа на единицу.
  2. Объявляет переменные и функции для решения проблемы.
  3. Заполняет массив структур 'num' случайными числами от 0 до 99999 и сохраняет количество цифр в каждой записи.
  4. Выводит на экран текущее значение каждой записи.
  5. Изменяет каждую цифру в каждой записи на уменьшенное на единицу значение.
  6. Сортирует массив структур 'num' по количеству цифр в каждой записи.
  7. Выводит на экран отсортированное значение каждой записи. Список действий, выполняемых в коде:
  8. Заполнение массива структур 'num' случайными числами от 0 до 99999 и сохранение количества цифр в каждой записи.
  9. Печать текущего значения каждой записи.
  10. Изменение каждой цифры в каждой записи на уменьшенное на единицу значение.
  11. Сортировка массива структур 'num' по количеству цифр в каждой записи.
  12. Печать отсортированного значения каждой записи. Переменные и функции, используемые в коде:
  13. 'n' - количество элементов в массиве структур 'num'.
  14. 'srand(time(0))' - инициализация генератора случайных чисел текущим временем.
  15. 'rand() % 100000' - генерация случайного числа от 0 до 99999.
  16. 'cnt(x)' - функция для подсчета количества цифр в числе 'x'.
  17. 'rebuild(x)' - функция для изменения каждой цифры в числе 'x' на уменьшенное на единицу значение.
  18. 'insertSort(num, n)' - сортировка массива структур 'num' по количеству цифр в каждой записи.
  19. 'print(num, n)' - печать текущего значения каждой записи. Вмешательство в код не требуется.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы