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

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

25.09.2016, 14:03. Показов 1609. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru