Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2012, 15:45   #1
ВДПУ
Пользователь
 
Регистрация: 09.02.2011
Сообщений: 37
Лампочка тяжелая, но интересная задача: Дано 3 числа. Между ними можно ставить знаки операций: сложения, вычитания, умножения, деления

Дано 3 числа. Между ними можно ставить знаки математических операций: сложения, вычитания, умножения, деления. Сколько различных значений может образоваться в результате вычисления полученных таким образом выражений.
Например:
2+2+8=12 2-2+8=8 2*2+8=12 2/2+8=9
2+2-8=-4 2-2-8=-8 2*2-8=-4 2/2-8=-7
2+2*8=18 2-2*8=-14 2*2*8=32 2/2*8=8
2+2/8=2.25 2-2/8= 1.75 2*2/8= 0.5 2/2/8=0.125
Всего, 16 возможных выражений, но разных значений - 13

Код:
var a,b,c,n,i,n1:integer;
  ab,ab1,ab2,ab3,dod,abc,abc1,abc2,abc3:real;
begin
  write(' ');
  read(a,b,c);
  n:=16;
  ab:=(a+b);
  ab1:=(a-b);
  ab2:=(a*b);
  ab3:=(a/b);
  abc:= (ab+c);
  abc1:=(ab-c);
  abc2:=(ab*c);
  abc3:=(ab/c);
______________
Название темы по правилам форума должно адекватно отражать суть решаемой задачи/проблемы.
На первый раз я исправил.
В последующем, темы с подобным названием будут закрываться или удаляться,
а автор такой темы будет получать штрафные баллы.
Учтите это на будущее.

Модератор.


Последний раз редактировалось Serge_Bliznykov; 25.02.2012 в 22:39.
ВДПУ вне форума Ответить с цитированием
Старый 25.02.2012, 17:41   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Что здесь "тяжёлого"-то?...

АлгорЫтм:
Код:
#!/usr/bin/python
# -*- coding: cp1251 -*-

from numpy import append, array

def DoOp( x, op, y ):
    if op == '+':
        z = x + y
    elif op == '-':
        z = x - y
    elif op == '*':
        z = x * y
    else:
        z = x / y

    return z


op = ['+', '-', '*', '/']
a = 2. ; b = 2. ; c = 8.
allDiffRes = array( [], dtype = float )


for op1 in op:
    for op2 in op:
        if op1 == '+' or op1 == '-':
            if op2 == '*' or op2 == '/':
                res = DoOp( b, op2, c )
                res = DoOp( a, op1, res )
            else:
                res = DoOp( a, op1, b )
                res = DoOp( res, op2, c )
        else:
             res = DoOp( a, op1, b )
             res = DoOp( res, op2, c )
        print a, op1, b, op2, c, '=', res
        if res not in allDiffRes:
            allDiffRes = append( allDiffRes, res )

print 'The number of diferent results =', len( allDiffRes )

#
1. Понятия не имею, есть ли в Паскале аналоги питоновских in и append(). Если нету - придётся запрограммировать вручную. При этом, программируя in для чисел с плавающей, стоит, наверное, учитывать погрешность вычислений.

2. Предполагается, что выражение имеет вид a op1 b op2 c. Если нужно ещё и всё возможные комбинации следования a, b и c перебрать, прикручивается элементарная комбинаторика.

3. Какой-то контроль входных данных добавить. Хотя бы от попытки деления на 0 предохраниться.
Vago вне форума Ответить с цитированием
Старый 25.02.2012, 19:59   #3
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Если немного пошаманить, то можно сделать код и для корней, и для степеней, и для любого количества цифр.
Код:
program Operations;
Const N : Integer = 3;
var
   A: array[1..N] of Real;
   Count : Integer;
   
function AddOperation(Sum : Real; S: String; I: Integer);
var S1 : String;
begin
   if I = 0 then
     begin
        writeln(S + ' ', Sum:2:3);
        Count := Count + 1;
     end
   else
    begin
       Str(A[I], S1); 
       AddOperation(Sum+A[I], S + '+' + S1, I-1);
       AddOperation(Sum-A[I], S + '-' + S1, I-1);
       AddOperation(Sum*A[I], S + '*' + S1, I-1);
       AddOperation(Sum/A[I], S + '/' + S1, I-1);
    end; 
end;

var S1: String;

begin
   .... Ввод массива цифр A;
   Count := 0;
   Str(A[1], S1); 
   AddOperation(A[1], S1, N-1);
  writeln('Количество записей: ', count:3:0);
end.
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 25.02.2012 в 20:08.
DiemonStar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на C# - заданы цифры - расставить знаки сложения и вычитания так, чтобы получилось выражение с заданным результатом eduard93 Помощь студентам 1 08.12.2011 00:03
Используя только операции сложения и вычитания, найти частное от деления нацело N на K, а также остаток Nipuh Паскаль, Turbo Pascal, PascalABC.NET 2 30.05.2011 13:52
задача на C#-выполнение операций сложения и умножения на двоичных числах maximas Помощь студентам 1 29.04.2011 17:12
програма для умножения и сложения таблицы NoVeto Общие вопросы C/C++ 6 09.02.2010 12:52