БлогNot. Считая без приоритета...

Считая без приоритета...

Скину в качестве памятки, нужен будет подобный пример рекурсии.

Составить программу, которая бы нашла все варианты размещения знаков арифметических операций +, -, * на месте вопросительных знаков в выражении 1?2?3?4?5?6?7?8?9, так, чтобы значение выражения равнялось заданной величине v=100.

Арифметические действия выполняются слева направо без учёта обычного приоритета операций.

Вот листинг консольной программы (Visual Studio):

#include <iostream>
#include <vector>
#include <string>
#include <windows.h>
 
using namespace std;

string str(int n){ //цифра n строкой
 string a = "0";
 a[0] = (char)n;
 return a;
}
 
int eval(vector<int> arr, string expr, int v){ //основной метод
 int total = 0;
 vector <int> p = arr, m = arr, mp = arr;
 int sp = p[1], sm = m[1], smp = mp[1];
 if (arr.size() > 2){
  p[1] += p[0]; p.erase(p.begin()); total += eval(p, expr + string("+") + str('0' + sp), v);
  m[1] = m[0] - m[1]; m.erase(m.begin()); total += eval(m, expr + string("-") + str('0' + sm), v);
  mp[1]*=mp[0]; mp.erase(mp.begin()); total+=eval(mp, expr + string("*") + str('0' + smp), v);
 } 
 else {
  if ((arr[0] - arr[1]) == v) { total++; cout<<expr<<"-"<<arr[1]<<endl;}
  if ((arr[0] + arr[1]) == v) { total++; cout<<expr<<"+"<<arr[1]<<endl;}
  if ((arr[0] * arr[1]) == v) { total++; cout<<expr<<"*"<<arr[1]<<endl;}
 }
 return total;
}
 
int main(){
 vector <int> arr; 
 for (int i = 1; i < 10; i++) arr.push_back(i); //массив 1,2,...,9
 string expr = "1";
 int total = eval(arr, expr, 100);
 cout << "total=" << total << endl;
 system("pause");
 return 0;
}

25.06.2015, 18:42 [6748 просмотров]


теги: c++ алгоритм

К этой статье пока нет комментариев, Ваш будет первым