Ввод n. Положите + или - между 1,2,3,4,5,6,7,8,9, чтобы найти выражение, равное n (122 = 12 + 34 - 5 - 6 + 78 + 9 или 146 = 123 + 45 + 67 - 89)C программирование 122 = 12 + 34 - 5 - 6 + 78 + 9
Моя идея состоит в том, что мы можем заполнить между двумя значениями 3: 0 без пробелов, 1 для + и 2 для - например, 1 + 2 + 3456 - 78 + 9 - 11000201. И это base-3-number Существует 3^8 выражений для тестирования, потому что у нас есть 8 позиций для заполнения, каждый из которых имеет 3 способа. Начать цикл, i от 1 до 3^8. Преобразуйте каждый i в base-3-номер и преобразуйте каждый символ i в + - или без пробела, чтобы вычислить, соответствует ли данное выражение n или нет. Если равно, распечатайте выражение и завершите цикл ...
Моя проблема в том, что программа дает мне неправильный ответ, и я не могу найти ошибку. , например, я вход 145, но он дал мне 123 + 45 + 67 - 89 (= 146)
Это код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n, result, a[100],count, i,j, test,temp, checkpoint,num,checkresult=0;
printf("Input n\n");
scanf("%d",&n);
for (num=1;num<=6561;num++)
{
count=1;
test = num;
result = 0;
checkpoint=0;
a[0]=1;
//convert to base 3
while (test>0)
{
a[count]=test%3;
//printf("%d ",a[count]);
test = test/3;
count++;
}
count--;
//put 0 to fill full 8 blank
while (count<8)
{
count++;
a[count]=0;
//printf("%d ",a[count]);
}
//inverse the sequence to have the right
for (i=1;i<=count/2;i++)
{
temp = a[i];
a[i] = a[count+1-i];
a[count+1-i] = temp;
}
//calculate the number
//1 is +, 2 is -, 0 is no blank
for (i=1;i<=8;i++)
{
if ((a[i]==1) || (a[i]==2))
{
if (a[checkpoint]==1)
for (j=checkpoint+1;j<=i;j++)
result = result + j*pow(10,i-j);
if (a[checkpoint]==2)
for (j=checkpoint+1;j<=i;j++)
result = result - j*pow(10,i-j);
checkpoint=i;
}
}
if (i==9)
{
if (a[checkpoint]==1)
for (j=checkpoint+1;j<=i;j++)
result = result + j*pow(10,i-j);
if (a[checkpoint]==2)
for (j=checkpoint+1;j<=i;j++)
result = result - j*pow(10,i-j);
}
//check if the result is correct or not. If correct, print it out and break the loop
if (result == n)
{
checkresult=1;
for (i=1;i<=8;i++)
{
printf("%d",i);
if (a[i]==1)
printf("+");
if (a[i]==2)
printf("-");
}
printf("9\n");
break;
}
}
if (checkresult==0)
printf("Can't found...");
return 0;
}
Есть возможности '2 * 3^8', потому что у вас не может быть ничего или' '' перед '1'. – mch
С стены. Я с полной потерей, чтобы понять, где может помочь тройная система чисел, поскольку ваш пример ввода имеет 9 разных значений. –
@WeatherVane В каждой позиции есть три возможные вещи, которые вы можете поставить: '+', '-' или ничего. Таким образом, каждая возможность соответствует числу в тройной системе чисел. –