Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8

Найти максимум числового выражения

25.09.2016, 14:03. Показов 1641. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задано числовое выражение
(sin1 + ... + sin(k)) * (sin(k+1) + ... + sin(n))
в двух скобках проставлены суммы синусов от чисел
натурального ряда. Всего чисел 100 и они расположены
в порядке возрастания от 1 до 100. Однако сколько этих
чисел в каждой скобке неизвестно. может 1, а может 99
Надо вычислить максимум независимо от N. 1 < N <=100

Вопросы
1. Есть ли иное решение?
2. Можно ли улучшить мою программу?
3. Кажется здесь можно использовать рекурсию?
например по количеству синусов во второй скобке?

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
REM
REM (sin1 + ... + SIN(k)) * (SIN(k+1) + ... + SIN(n))
REM
REM   max = 0.9577862
REM
 
CLS
CONST n = 100
 
FOR m = 2 TO n
FOR k = 1 TO m - 1
   s1 = 0
   FOR i = 1 TO k
      s1 = s1 + SIN(i)
   NEXT
 
   s2 = 0
   FOR i = k + 1 TO m
      s2 = s2 + SIN(i)
   NEXT
 
   IF max < s1 * s2 THEN
      max = s1 * s2
   END IF
NEXT k, m
 
PRINT "MAX ="; max
END
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.09.2016, 14:03
Ответы с готовыми решениями:

Найти максимум числового выражения 2
ТС предлагает вам решить эту задачу. Она принесет вам счастье и радость грядущего лета... Введем обозначение. sin = s. Дано числовое...

Найти максимум числового ряда
Числовой ряд не задан. Надо его еще построить так, чтобы он имел максимальную сумму. построение. задан ряд натуральных чисел 1, 2, 3,...

Найти значение выражения при помощи процедуры максимум из трех
Для чисел a b c найти значение выражения max abc+1/max(ab,ac,bc) с использованием процедуры нахождения максимального из трех чисел

33
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
25.09.2016, 16:32
Как-то у меня совсем не так получилось. Или я чего-то не так понял?
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
CLS
max = -100
FOR i = 1 TO 100
s = s + SIN(i)
NEXT
FOR i = 1 TO 100
s = s - SIN(i)
s2 = s2 + SIN(i)
IF s * s2 > max THEN max = s * s2: t = i
NEXT
PRINT max, t
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
25.09.2016, 16:49  [ТС]
кот Бегемот
Вы не расстраивайтесь - просто неточно поняли условие
задачи. я повторю еще раз более четко
Мы составляем выражение (пример)
1) в первой скобке (sin1+sin2+sin3) [число слагаемых от 1 до 99]
2) вторая скобка (sin4 + sin5) [последним может быть число sin100]
3) обе скобки перемножаются и получается некоторое число.
4) составляется другая пара скобок и вновь перемножается и
вновь получается некоторое число
5) и следующая пара скобок.
6) Из всех полученных чисел надо найти максимум
На что обратить внимание:
1. первая скобка всегда содержит sin1
2. если первая скобка заканчивается числом sin(k), то вторая
скобка начинается с числа sin(k+1)
3. как я сказал, общее число чисел НЕ ПРЕВЫШАЕТ 100
Может быть меньше (например 2)
4. числа соблюдают строгий порядок. То есть если есть
например sin7 и sin9, то должен быть и sin8 (между ними)
пример
(...+ sin7 + sin8 + sin9 +...) или другой пример
(...+ sin7) * (sin8 + sin9 + ...)
0
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
25.09.2016, 19:32
Лучший ответ Сообщение было отмечено echs как решение

Решение

Ну, просто добавим перебор всех вариантов. Работает гораздо быстрее вашей.
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
max = -100
FOR k = 1 TO 100
s = 0
s2 = 0
FOR i = 1 TO k
s = s + SIN(i)
NEXT
FOR i = 1 TO k
s = s - SIN(i)
s2 = s2 + SIN(i)
IF s * s2 > max THEN max = s * s2: t = i
NEXT
NEXT
PRINT max, t
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
25.09.2016, 20:26  [ТС]
кот Бегемот
Вы меня извините, но у вас самый последний цикл
противоречит стоящему перед ним циклу. Иными
словами, в последнем цикле вычитается то, что перед
ним только что складывалось. Может опечатка?
СРАВНИТЕ СТРОКИ 6 и 9. - парадокс.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
25.09.2016, 20:37
Лучший ответ Сообщение было отмечено echs как решение

Решение

У меня так получилось, почти как в предыдущем посте
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
DIM i AS LONG, j AS LONG, n AS LONG, s(1 TO 100) AS DOUBLE, mx AS DOUBLE, p AS DOUBLE
n = 100
s(1) = SIN(1)
FOR i = 2 TO n
    s(i) = s(i - 1) + SIN(i)
NEXT i
mx = s(1) * (s(2) - s(1))
FOR j = 2 TO n
FOR i = 1 TO j - 1
    p = s(i) * (s(j) - s(i))
    IF p > mx THEN mx = p
NEXT i, j
PRINT mx
0
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
25.09.2016, 20:51
Цитата Сообщение от echs Посмотреть сообщение
но у вас самый последний цикл
противоречит стоящему перед ним циклу. Иными
словами, в последнем цикле вычитается то, что перед
ним только что складывалось. Может опечатка?
СРАВНИТЕ СТРОКИ 6 и 9. - парадокс.
Никакого парадокса нет. Сначала мы находим общу сумму, а потом начинаем перекидывать из неё слагаемые в другую. Всё так и надо.

А почему вы все так уверены, что мах будет положительным и не инициализируете мах? За это на ЕГЭ 3 балла снимают, специалисты, блин...

m-ch, использование массива там, где он не обязателен считается нерациональным способом решения
Да и ответ у Вас подозрительный...


Не совпадает с двумя предыдущими
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
25.09.2016, 20:59
Лучший ответ Сообщение было отмечено echs как решение

Решение

Цитата Сообщение от кот Бегемот Посмотреть сообщение
А почему вы все так уверены, что мах будет положительным и не инициализируете мах?
У меня начальный max вычисляется.
Кстати, где гарантия, что max будет больше -100?

Цитата Сообщение от кот Бегемот Посмотреть сообщение
m-ch, использование массива там, где он не обязателен считается нерациональным способом решения
В зависимости от задачи можно либо один раз вычислить синусы (итого 100 обращений к функции Sin) и выделить под это 800 байт памяти, либо 15150 раз вычислять синусы.
Если важна скорость, то использование массива оправдано, т.к. производится меньше вычислений.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
25.09.2016, 21:02
Цитата Сообщение от кот Бегемот Посмотреть сообщение
Да и ответ у Вас подозрительный...
0,957785942060806

точно такой же как и у echs из первого поста
Миниатюры
Найти максимум числового выражения  
1
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
25.09.2016, 21:19
m-ch, я не утверждаю, что моя программа оптимальна. Даже навскидку видно, что каждый раз сумму синусов вычислять не обязательно. можно просто добавлять к сумме по очередному синусу - я не писал оптимальную программу, я добавил цикл к имеющейся, рассчитанной на 100 чисел. В любом случае модернизированная программа займёт в памяти места меньше, чем Ваша.

Добавлено через 3 минуты
Цитата Сообщение от m-ch Посмотреть сообщение
Кстати, где гарантия, что max будет больше -100?
Вы можете убедить меня, что сумма 100 синусов меньше -100?
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
25.09.2016, 23:11
Лучший ответ Сообщение было отмечено echs как решение

Решение

Проверил для n=10000
Код с массивом считает в 2 раза быстрее

Код на VBA
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub test1()
Dim mx As Double, i As Long, j As Long, s As Double, s1 As Double, s2 As Double, t As Single
t = Timer
mx = Sin(1) * Sin(2)
For i = 1 To 10000
    s1 = s1 + Sin(i)
    s2 = 0
    For j = 1 To i - 1
        s2 = s2 + Sin(j)
        If s2 * (s1 - s2) > mx Then mx = s2 * (s1 - s2)
Next j, i
Debug.Print mx, Timer - t
End Sub
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub test2()
Dim i As Long, j As Long, s(1 To 10000) As Double, mx As Double, t As Single
t = Timer
s(1) = Sin(1)
For i = 2 To 10000
    s(i) = s(i - 1) + Sin(i)
Next i
mx = s(1) * (s(2) - s(1))
For j = 2 To 10000
For i = 1 To j - 1
    If s(i) * (s(j) - s(i)) > mx Then mx = s(i) * (s(j) - s(i))
Next i, j
Debug.Print mx, Timer - t
End Sub
Результат, время (сек.)
Без массива: 0,958589639861934 - 4,25
С массивом: 0,958589639861934 - 2,1875
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
26.09.2016, 07:44
на Freebasic разница в скорости более чем в 10 раз
Миниатюры
Найти максимум числового выражения   Найти максимум числового выражения  
1
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
26.09.2016, 08:41
Цитата Сообщение от m-ch Посмотреть сообщение
Код с массивом считает в 2 раза быстрее
И быстрее, чем эта программа:?
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
max = -100
s = 0
FOR k = 1 TO 100
s = s + SIN(k)
s2 = 0
v = s
FOR i = 1 TO k
v = v - SIN(i)
s2 = s2 + SIN(i)
IF v * s2 > max THEN max = v * s2
NEXT
NEXT
PRINT max
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
26.09.2016, 08:50  [ТС]
кот Бегемот
Зачем инициализировать max?
Уже первые два слагаемые дают ответ. Максимум положителен.
(отрицательный максимум указывает на ошибку)
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
26.09.2016, 09:26
Цитата Сообщение от кот Бегемот Посмотреть сообщение
И быстрее, чем эта программа:?
Для чистоты эксперимента запустил Ваш и свой код в QBasic при n = 5000 (если задать больше, то очень долго ждать)

Ваш код:
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
t = TIMER
max = -100
s = 0
FOR k = 1 TO 5000
s = s + SIN(k)
s2 = 0
v = s
FOR i = 1 TO k
v = v - SIN(i)
s2 = s2 + SIN(i)
IF v * s2 > max THEN max = v * s2
NEXT
NEXT
PRINT max, TIMER - t
Мой код без массива:
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
DIM mx AS DOUBLE, i AS LONG, j AS LONG, s1 AS DOUBLE, s2 AS DOUBLE, t AS SINGLE
t = TIMER
mx = SIN(1) * SIN(2)
FOR i = 1 TO 5000
    s1 = s1 + SIN(i)
    s2 = 0
    FOR j = 1 TO i - 1
        s2 = s2 + SIN(j)
        IF s2 * (s1 - s2) > mx THEN mx = s2 * (s1 - s2)
NEXT j, i
PRINT mx, TIMER - t
Мой код с массивом:
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
DIM i AS LONG, j AS LONG, s(1 TO 5000) AS DOUBLE, mx AS DOUBLE, t AS SINGLE
t = TIMER
s(1) = SIN(1)
mx = SIN(1) * SIN(2)
FOR j = 2 TO 5000
s(j) = s(j-1) + SIN(j)
FOR i = 1 TO j - 1
    IF s(i) * (s(j) - s(i)) > mx THEN mx = s(i) * (s(j) - s(i))
NEXT i, j
PRINT mx, TIMER - t
Время работы соответственно:
163,1289 сек
92,37891 сек
20,58984 сек
0
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
26.09.2016, 09:41
Я вот не пойму: зачем выдумывать то, чего нет в задаче? Есть условие "не более 100 чисел". Ваша программа неэффективна по памяти. А скорость на 100 элементах не имеет никакого значения, поскольку измеряется долями секунд. А то, что пишете Вы (про n=5000) - это уже Ваша личная задача.

Цитата Сообщение от echs Посмотреть сообщение
Уже первые два слагаемые дают ответ.
Вы это откуда взяли? Ручками делали? Ну, тогда зачем Вам компьютер, вручную и максимум бы посчитали...
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
26.09.2016, 10:22
Цитата Сообщение от кот Бегемот Посмотреть сообщение
Есть условие "не более 100 чисел". Ваша программа неэффективна по памяти. А скорость на 100 элементах не имеет никакого значения, поскольку измеряется долями секунд.
Чтобы хранить 100 элементов массива типа Double нужно 800 байт (типа Single - 400 байт), что ничтожно мало по сравнению с тем, сколько сама программа занимает места в памяти.
Цитата Сообщение от кот Бегемот Посмотреть сообщение
А то, что пишете Вы (про n=5000) - это уже Ваша личная задача.
Значение 5000 было взято для того, чтобы оценить производительность алгоритмов.
Основные торможением времени работы программы является вычисление синусов, в Вашем коде при n=100 функция синус вычисляется 10200 раз, в моем (без массива) - 5050 раз (в два раза меньше)

Несколько раз запустил код в QBasic при n=100, Ваш алгоритм дает значение 0,11 сек (иногда 0,05), мой без массива - стабильно 0,05 секунды, с массивом - 0 сек.

В более сложных программах нужно находить баланс между производительностью и объемом выделяемой памяти

Цитата Сообщение от кот Бегемот Посмотреть сообщение
Вы можете убедить меня, что сумма 100 синусов меньше -100?
Вы значение -100 тоже ручками посчитали?
Почему не задать начальный максимум равным -1, так как произведение двух синусов не может быть меньше -1
А исходя из задачи первое вычисление будет sin(1)*sin(2), соответственно нижняя граница максимума - не менее -1 (тоже оценил математически, как и Вы значение -100)
0
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
26.09.2016, 10:59
Не хочу углубляться в дебри уже просто потому, что я не ставил перед собой задачу написать оптимальную программу, я лишь сказал то, что сказал: при прочих равных программа, к примеру, на ЕГЭ, оценивается по эффективности затрат памяти и программа без массива поэтому считается оптимальнее программы с массивом. Что до вычислений синуса, я уже говорил, что не пытался оптимизировать свою программу, не сомневаюсь, что можно это сделать.
Максимум я не вычислял нигде, если не считать умножения 100 на 1, я просто оценил то, что сумма 100 синусов не сможет выйти за пределы -100. А вот насчет того, что произведение не будет меньше -1, тут неточность, ибо мы перемножаем не синусы, а их суммы, а сумма может и вылезти за -1. И sin(1)*sin(2) - это лажа.
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
26.09.2016, 11:22  [ТС]
кот Бегемот
Вы правы в том, что сумма синусов может быть любым
числом, в том числе и отрицательным. Но максимум
(а ищется именно он) никогда не будет отрицательным.
Расчеты это подтверждают. Ибо все суммы никогда не
будут разом или как то иначе отрицательны.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
26.09.2016, 11:29
Цитата Сообщение от кот Бегемот Посмотреть сообщение
И sin(1)*sin(2) - это лажа.
При k=1 и n=2 вычисляется как раз sin(1)*sin(2)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.09.2016, 11:29
Помогаю со студенческими работами здесь

Найти минимум и максимум в массивах чисел и вычислить значение выражения
Вычислить Z=0.2X-Y*Y, где X-минимальный элемент массива Ai, i=1,...,25, Y-максимальный элемент массива Bj,j=1,...,30.

Найти максимум в диагонали матрицы и перевернуть строки, в которых есть этот максимум
Найти максимум в диагонали матрицы и перевернуть строки, в которых есть этот максимум. Вот заполнение и максимум, но не знаю, как строки...

Разбор числового выражения
нужно преобразовать программу Разбор числового выражения например: (((1+2)+3)*10-(3-1))/10= Если расстановка скобок верна, то...

Вычислить значение числового выражения
Нужна помощь! Вычислить значение числового выражения. C++ Выражение указано в изображении. Может кто с таким сталкивался? Я новичок((

Найти максимум из девяти чисел(максимум из трех чисел(максимум из двух чисел)
Сделал кароч ток не знаю что в конце писать вот код: function maks_2(a,b:real):real; begin if a&gt;b then maks_2:=a else...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru