Расставить арифметические знаки между элементами последовательности и вычислить выражение - C (СИ)
Формулировка задачи:
Добрый день,любимые-уважаемые!
есть очень интересное задание,не знаю,встречался ли кто с таким.
у нас есть 10 чисел в таком порядке:0 1 2 3 4 5 6 7 8 9.Между числами можно ПРОИЗВОЛЬНО вставлять знаки + или -,таким образом мы получим какое-то выражение с результатом.например:
0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
0 - 12 - 3 + 4 + 56789 = 56778
0 - 1 + 234 - 56 - 7 - 89 = 81
Задание:написать программу,которая на входе получит целое число и выпишет все существующие выражения,которые дают результатом это число.То есть,к примеру,если программа получит на входе 45,то как результат выпишет 0+ 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 и все остальные выражения,с помощью которых можно получить 45(естественно,выражения,сложенные из цифр 0 1 2 3 4 5 6 7 8 9,идущих по порядку.)
Кто-нибудь о таком слышал?
СРАЗУ ОГОВОРЮСЬ,НУЖНО ВЫПОЛНИТЬ В СИ,в этом заключается основная проблема.
Решение задачи: «Расставить арифметические знаки между элементами последовательности и вычислить выражение»
textual
Листинг программы
#include <stdio.h> #define N 9 int increment(int *); void print(int *); int main(void) { int state[N], i, sum, x; for (i=0; i < N; i++) state[i] = -1; printf("Enter x: "); scanf("%d", &x); while(increment(state)) { sum = 0; for (i=0; i < N; i++) sum += (i+1) * state[i]; if (sum == x) print(state); } return 0; } int increment(int *tick) { int i; tick[N-1] += 2; for (i = N-1; i > 0; i--) if (tick[i] == 3) { tick[i-1] += 2; tick[i] = -1; } return tick[0] != 3; } void print(int *tick) { int i; printf("0"); for (i=0; i < N; i++) printf(" %c %d", (tick[i] > 0 ? '+' : '-'), i+1); printf("\n"); }
Объяснение кода листинга программы
В этом коде выполняется следующая последовательность действий:
- Ввод числа x и инициализация массива state. Сначала пользователю предлагается ввести число x. Затем, в цикле, все элементы массива state инициализируются значением -1.
- Цикл поиска решения.
Цикл начинается с ввода числа x и продолжается до тех пор, пока значение x не будет найдено. В каждой итерации цикла выполняется следующее:
- Вычисление суммы элементов массива state.
- Проверка равенства суммы и числа x.
- Если сумма равна x, то выполняется функция print, которая выводит решение на экран.
- Функция increment. Эта функция увеличивает значение каждого элемента массива на 2, начиная с последнего элемента. Если значение какого-либо элемента становится равным 3, то функция начинает проходить по всем элементам, начиная с предпоследнего, и увеличивать их значения на 2. При этом, если значение какого-либо элемента становится равным 3, то значение предыдущего элемента увеличивается на 2, а значение текущего элемента устанавливается равным -1. Функция возвращает значение tick[0], которое используется для определения, была ли найдена комбинация, удовлетворяющая условию.
- Функция print.
Эта функция выводит решение на экран. Сначала выводится число 0, затем, в цикле, выводятся все элементы массива state. Если значение элемента больше 0, то перед ним выводится символ
+
, иначе-
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д