Дано трёхзначное натуральное число [latex]N[/latex]. Определить сумму наибольшего и наименьшего трёхзначных чисел, которые могут быть образованы из числа [latex]N[/latex] перестановкой цифр.
Входные данные
Натуральное число [latex]N[/latex] [latex]\left(100\leq N\leq 999 \right)[/latex].
Выходные данные
Ответ к задаче.
Код программы (C++):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <algorithm> using namespace std; int main() { int N, b[3], c[3]; cin >> N; for (int i=0; i<3; i++) { b[i]=N%10; c[i]=N%10; N=N/10; } sort(b,b+3); sort(c,c+3); reverse (c,c+3); if ((b[0]==0)&&(b[1]!=0)) swap (b[0],b[1]); else if ((b[0]==0)&&(b[1]==0)) swap (b[0],b[2]); int b1=100*b[0]+10*b[1]+b[2]; int c1=100*c[0]+10*c[1]+c[2]; cout << b1+c1 << endl; return 0; } |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import java.util.*; import java.lang.*; import java.io.*; class Main { public static void swap (int []a, int i, int j) { int tmp=a[i]; a[i]=a[j]; a[j]=tmp; } public static void main (String[] args) { int N; int []b = new int [3]; int []c = new int [3]; Scanner in = new Scanner (System.in); N=in.nextInt(); for (int i=0; i<3; i++) { b[i]=N%10; c[i]=N%10; N/=10; } Arrays.sort(b); Arrays.sort(c); swap (c,0,2); if ((b[0]==0)&&(b[1]!=0)) swap(b,0,1); else if ((b[0]==0)&&(b[1]==0)) swap(b,0,2); int b1=100*b[0]+10*b[1]+b[2]; int c1=100*c[0]+10*c[1]+c[2]; System.out.println (b1+c1); } } |
Когда я увидела эту задачу, то мне в голову сразу пришло решение с применением массивов. Изначально пользователю предлагается ввести трёхзначное число, которое я впоследствии раскладываю на отдельные элементы массивов, один из которых определяет минимальное трёхзначное число, а второй, в свою очередь, — максимальное.
Затем я сортирую первый массив по возрастанию, а второй по убыванию.
Далее проблема возникает именно с первым массивом, так как его первым элементом может оказаться 0, что нам не подходит, так как наше минимальное число, образованное перестановкой, обязано быть трёхзначным по условию. Для этого я делаю 2 несложных проверки, в результате которых первый элемент массива меняется местами либо со вторым, либо с третьим.
После чего я перевожу элементы массива в одно трёхзначное число и наконец-то получаю сумму.
Сложность задачи 66%.
— Метки забыли?
— Результаты лучше не картинкой, а ссылкой.
— «знаменует» не очень точно подобранное слово
— Решение хорошо масштабируется. Т.е. его легко переделать для k-значных чисел. Только два массива совсем ни к чему. Достаточно одного массив и складывать элементы, стоящие на одинаковом расстоянии от начала и от конца.
— Зачем переменную для хранения N называть a?
P.S. У меня более «ленивое» и не масштабируемое решение этой задачи
Исправила: метки поставила, результат исправила, слово заменила и переменную переименовала.
Я не понимаю, как можно переделать эти два массива в один, так как они не есть отображением друг друга, в первом массиве приходилось менять местами элементы, если они были 0 и стояли на первом месте.
Спасибо за исправления. И ещё: у меня запись не отображается, пишет, что страница не найдена. Может, её следует добавить заново?
Всё в порядке. Оставляйте массивы как есть.
Java. Нужна своя функция swap()
Вынесла в отдельную функцию.
Засчитана Java версия.