Уменьшить каждую цифру в записи числа на единицу и вернуть количество цифр - 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, которая выполняет следующие действия:
- Задаёт проблему: уменьшение каждой цифры в записи числа на единицу.
- Объявляет переменные и функции для решения проблемы.
- Заполняет массив структур 'num' случайными числами от 0 до 99999 и сохраняет количество цифр в каждой записи.
- Выводит на экран текущее значение каждой записи.
- Изменяет каждую цифру в каждой записи на уменьшенное на единицу значение.
- Сортирует массив структур 'num' по количеству цифр в каждой записи.
- Выводит на экран отсортированное значение каждой записи. Список действий, выполняемых в коде:
- Заполнение массива структур 'num' случайными числами от 0 до 99999 и сохранение количества цифр в каждой записи.
- Печать текущего значения каждой записи.
- Изменение каждой цифры в каждой записи на уменьшенное на единицу значение.
- Сортировка массива структур 'num' по количеству цифр в каждой записи.
- Печать отсортированного значения каждой записи. Переменные и функции, используемые в коде:
- 'n' - количество элементов в массиве структур 'num'.
- 'srand(time(0))' - инициализация генератора случайных чисел текущим временем.
- 'rand() % 100000' - генерация случайного числа от 0 до 99999.
- 'cnt(x)' - функция для подсчета количества цифр в числе 'x'.
- 'rebuild(x)' - функция для изменения каждой цифры в числе 'x' на уменьшенное на единицу значение.
- 'insertSort(num, n)' - сортировка массива структур 'num' по количеству цифр в каждой записи.
- 'print(num, n)' - печать текущего значения каждой записи. Вмешательство в код не требуется.