Расставить арифметические знаки между элементами последовательности и вычислить выражение - 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, то перед ним выводится символ
+, иначе-.