2015-10-21 1 views
2

Ввод 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; 
} 
+0

Есть возможности '2 * 3^8', потому что у вас не может быть ничего или' '' перед '1'. – mch

+0

С стены. Я с полной потерей, чтобы понять, где может помочь тройная система чисел, поскольку ваш пример ввода имеет 9 разных значений. –

+0

@WeatherVane В каждой позиции есть три возможные вещи, которые вы можете поставить: '+', '-' или ничего. Таким образом, каждая возможность соответствует числу в тройной системе чисел. –

ответ

1

Я решил эту проблему.

Просто нужно изменить тип переменной результата на двойной. Потому что выражение pow требует переменной двойного типа