На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Страницы: (4) [1] 2 3 ... Последняя » все  ( Перейти к последнему сообщению )  
> Задача №5 , Расставить +/-
    Имеется последовательность десятичных цифр 1234567890123456789
    Расставить внутри этой последовательности(т.е между цифрами) знаки + и/или - так, чтобы в результате вычисления полученного выражения получилось заданное число.
    Если существуют несколько вариантов - выдать тот из них, который состоит из наименьшего количества операций(сложения или вычитания).
    Если вариантов нет - сообщить об этом.
    Прим.: для числа 34 выражение(одно из выражений) может быть таким:
    12+34-56+78-90+123-45+67-89



    Дополнение: для простоты будем считать, что заданное число удовлетворяет следующему критерию:
    0 < число < 1000000
    Сообщение отредактировано: trainer -
      задачку уже можно решать или еще это только предложение?
        Ну если задание ясно - можно решать.
          Какие требования накладываются на решение задачи:
          Оптимизация по скорости ?
          Оптимизация по памяти ?
          Компактный и читабельный код ?
          или достаточно просто представить какое-нибудь решение ?

          Задачи интересные. Но не всегда понятно в каком виде должен быть результат :)
            У кого как получится. :) Интересные варианты, возможно, отмечу. :)
            Может быть и самый медленный вариант, но с очень интересным решением.
            Это же задача, а не соревнование.
            Хотя читабельность приветстсвуется. :)
              Ну типа вот :) :
              ExpandedWrap disabled
                 
                #include <stdio.h>
                #include <stdlib.h>
                #include <string.h>
                 
                #define false 0
                #define true 1
                 
                #define maxlen 8
                #define str "1234567890123456789"
                 
                #define max_deep 6
                 
                long value;
                char sr[30];
                 
                char calc(char *s, char *sr,long t, int deep)
                {
                   if (deep>max_deep) return false;
                 
                   long temp;
                   char stemp[maxlen+1];
                   int i = strlen(s);
                   if (i>maxlen) i=maxlen;
                 
                   for (;i>0; i--)
                   {
                      strncpy(stemp, s, i);
                      stemp[i]='\0';
                      temp = atol(stemp);
                      if (*(s+i)=='\0')
                      {
                        if (t+temp==value)
                        {
                            strcpy(sr, "+");
                            strcat(sr, stemp);
                            return true;
                        }
                        else if (t-temp==value)
                        {
                            strcpy(sr, "-");
                            strcat(sr, stemp);
                            return true;
                        }
                      }
                      else
                      {
                        if (calc(s+i, sr, t+temp, deep+1))
                        {
                            char ttt[30];
                            strcpy(ttt, "+");
                            strcat(ttt, stemp);
                            strcat(ttt, sr);
                            strcpy(sr, ttt);
                            return true;
                        }
                        else if (calc(s+i, sr, t-temp, deep+1))
                        {
                            char ttt[30];
                            strcpy(ttt, "-");
                            strcat(ttt, stemp);
                            strcat(ttt, sr);
                            strcpy(sr, ttt);
                            return true;
                        }
                      }
                   }
                   return false;
                }
                 
                void main()
                {
                   scanf("%U", &value);
                   if (calc(str, sr, 0, 0)) printf("%s\n", sr);
                   else printf("no!\n");
                   getchar(); getchar();
                }
              Сообщение отредактировано: Cool_Blade -
                как относится к первому минусу ???

                ExpandedWrap disabled
                  You have a custom string '12345'
                  What number you want to receive ? 45
                  1+2-3+45
                  -1-2+3+45
                  Press any key...


                ExpandedWrap disabled
                  You have a custom string '12345'
                  What number you want to receive ? 2344
                  -1+2345
                  Press any key...
                  Цитата
                  trainer, 7.04.04, 09:58
                  Расставить внутри этой последовательности
                  :)
                  Т.е. можете считать, что все числа, которые могут составить полученное вражение, должны быть положительны.
                  P.S. Задание уточнено 8.04.04, 11:51 мск
                  Сообщение отредактировано: trainer -
                    особо потестить не начем :) но все-таки вариантик свой выложу.
                    Конвертит atol'ом так что вполне возможны баги с переполнением :(
                    хотя что еще ожидать, работать с long double уже морока и немного не катит к смыслу задачи... :wall:
                    Прикреплённый файлПрикреплённый файлplusminus.cpp (2.39 Кбайт, скачиваний: 220)
                      Исправил ошибку в программе - см. выше :)
                        (9+0123) == (9+123) ?
                        :)
                          Цитата
                          redfred, 8.04.04, 14:22
                          (9+0123) == (9+123) ?
                          И что это значит?
                            Система надеюсь, десятичная. Можно ведь и на такой вариант напороться:
                            ExpandedWrap disabled
                                
                              if( (9+0123) == (9+123)  ) printf("(9+0123) == (9+123)\n" );
                                                 else    printf("(9+0123) != (9+123)\n" );

                            Что, собственно, у меня и получилось :)

                            Добавлено в :
                            Думаю, что я народ запутал:)
                            Спрошу иначе: При переборе вариантов могут получаться слагаемые с 0 впереди. Некоторые функции воспринимают его как восьмеричное число. Я так полагаю, что, перевод в число строки "0123" должен быть таким же как перевод в число "123". Так или нет ?
                              Цифры(и числа) десятичные.
                              Это дополнение уже внесено в условие(см. #1)

                              P.S. Рассматривайте задачу с точки зрения математики. C/C++ в данном случае - инструмент реализации. :)
                              Сообщение отредактировано: trainer -
                                вот мое решение. :unsure:
                                ExpandedWrap disabled
                                   
                                  #include <string>
                                  #include <iostream>
                                   
                                  using namespace std;
                                  string s;
                                   
                                  long len,n,N, top;
                                  struct PlusMinus
                                  {
                                      long offset;
                                      char c;
                                  };
                                   
                                  PlusMinus Plus[10000];
                                   
                                  void CalculateIt(int offset,int num);
                                   
                                   
                                  int main(int argc, char* argv[])
                                  {
                                   
                                      long nMax, i, j;
                                   
                                      while(true)
                                      {
                                          std::cin>>s;
                                          std::cin>>N;
                                          len = s.length();
                                          
                                          nMax = len - 1;
                                          try
                                          {
                                           for(n = 0; n <= nMax; n++)
                                           {
                                               top = -1;
                                               CalculateIt(1,n);
                                           }
                                           cout<<"The solution doesn't exist.I'm really sorry."<<endl;
                                           continue;
                                          }
                                          catch(int k)
                                          {
                                              if(k != 1) break;
                                              string sTemp,sOut;
                                              // êîððåêòèðîâêà âûõîäíîé ïîñëåäîâàòåëüíîñòè, ò.å. ÷òîáû âûâîä íå ñîäåðæàë
                                              // ÷èñåë, íà÷èíàþùèõñÿ ñ íóëÿ
                                              for(i = 0, j = 0; i < len; i++)
                                              {
                                                  sTemp += s[i];
                                                  if(j < top + 1 )
                                                  if(i == Plus[j].offset - 1 && top != -1)
                                                  {
                                                      sTemp += char(Plus[j++].c);
                                                  }
                                              }
                                              j = sTemp.length();
                                              char PrevSign = 0;
                                              for(i = 0; i < j; i++)
                                              {
                                                  sOut += sTemp[i];
                                                  if(sTemp[i] == '0' && i + 1 != j &&
                                                     (sTemp[i + 1] != '-' || sTemp[i + 1] != '+') &&
                                                     ((sTemp[i - 1] == '-' || sTemp[i - 1] == '+') || PrevSign))
                                                  {
                                                      if(!PrevSign)
                                                      {
                                                          PrevSign = sTemp[i - 1];
                                                          sOut += PrevSign;
                                                      }
                                                      else
                                                       sOut += PrevSign;
                                                  }
                                                  else
                                                      PrevSign = 0;
                                              }
                                              // âûâîä ðåçóëüòàòà
                                              cout<<sOut<<endl;
                                          }
                                   
                                      }
                                      return 0;
                                  }
                                   
                                  void CalculateIt(int offset, int num)
                                  {
                                  int i, sum, j, t, POW, off, MaxOff, k;
                                   
                                      if(!num)
                                      {
                                          //âû÷èñëåíèå ðåçóëüòàòà
                                          for(j = top, i = len - 1, sum = 0; j > - 1; j--)
                                          {
                                              t = 0; k = 0;
                                              POW = 1;
                                              do
                                              {
                                                  t += int(s[i] - '0')*POW;
                                                  POW *= 10;
                                                  i--;
                                                  k++;
                                              }while(i >= Plus[j].offset);
                                              sum += (Plus[j].c == '+') ? t : -t;
                                          }
                                      
                                          t = 0;
                                          POW = 1;
                                          do
                                          {
                                                  t += int(s[i] - '0')*POW;
                                                  POW *= 10;
                                          }while(--i != -1);
                                          sum += t;
                                          if(sum == N) throw int(1);
                                      }
                                      else
                                      {
                                          
                                          MaxOff = len -  num;
                                          // çàñîâûâàåì ìèíóñû è ïëþñû
                                          for(off = offset; off <= MaxOff; off++)
                                          {
                                              top++;
                                              Plus[top].c = '-';
                                              Plus[top].offset = off;
                                              CalculateIt(off + 1, num - 1);
                                   
                                              Plus[top].c = '+';
                                              CalculateIt(off + 1, num - 1);
                                              top--;
                                   
                                          }
                                      }
                                   
                                  return;
                                  }
                                Сообщение отредактировано: experimenter -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0461 ]   [ 16 queries used ]   [ Generated: 15.05.24, 04:49 GMT ]