На вход подается описание бинарного дерева. На листьях (висячих вершинах) этого дерева написаны целые числа (от -10^6 до 10^6). Идем от корня дерева, случайно поварачивая направо или налево (с вероятностями 0.5).
Чему равно cреднее значение числа на листе, в который мы в конечном счете придем? Ответ вывести с точностью до двух знаков после запятой.
Данную задачу можно решить без дерева. Когда встречаешь "(" - уменьшать вероятность, когда ")" - увеличивать: res=a[i]*(0.5)^(b[i]), где a[i] — это какое-то число из строки ввода, b[i] — скобочный итог к моменту, когда мы встретили это число. И суммировать результаты.
Т.е. когда скобка, он должен прибавлять или вычитать к s. А когда число - выполнять действия с ним. Подскажите.
using namespace std;
int main()
{
string str,st;
int index = 0,k=0,i=0;
double s=0,res=0;
res = 0;
char chr;
getline(cin,str);
while (index < str.length())
{
chr = str[index];
if ((chr!='(')||(chr!=')'||(chr!=' ')))
{
st = chr;
k = atoi(st.c_str()); cout << "k=" << k << endl;
res = res + k*pow(0.5, s); cout << "s=" << s << endl;
}
if (chr == '(')
{
s = s+1 ;
}
if (chr == ')')
{
s = s-1;
}
cout << "ravn" << res<<endl;
index++;
}
cout << "ravn" << res;
system("pause");
}
На вход подавться будет вот такое: (1 3(2 4))
Чтобы преобразовать число в строке str в тип int: int i = stoi(str);
#include <iostream>
#include <string>
int main() {
using namespace std;
for (string line; getline(cin, line); ) {
int i = stoi(line);
cout << i << endl;
}
}
1
-1
2
3 rest
- 4
1
-1
2
3
terminate called after throwing an instance of 'std::invalid_argument'
what(): stoi
Вывод показывает, что stoi() игнорирует пробелы до числа, игнорирует произвольные символы после числа в строке и не разрешает пробелы между минусом и целой частью числа.
В с++ стандартных средств нету для таких целей. Следует либо найти библиотеку, либо написать самостоятельно дынный функционал. Логика такова: считывается строка, делится на токены по whitespace, проверяется каждый токен, если он состоит только из цифр, то это число. В вашем случае на токены разделение будет хитрее из-за скобочных последовательностей.
Обновление
В вашем случае удобно читать на лету, то есть:
char c;
while((c = getchar()) != '\n'){
if(c >= '0' && c <= '9') //....
}
а преобразование символа-цифры в число:
int number = (c - '0');
@doomsday, и у вас логическая ошибка.
Нужно так:
if ((chr!='(') && (chr!=')' && (chr!=' ')))
Сборка персонального компьютера от Artline: умный выбор для современных пользователей