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

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

05.03.2017, 10:08. Показов 1462. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ТС предлагает вам решить эту задачу. Она принесет
вам счастье и радость грядущего лета...

Введем обозначение. sin = s. Дано числовое выражение
s1*s2 +...+ sk*s(k+1)*s(k+2) +...+ s200*s201
тут всего 201 функция sin. От sin(1) до sin(201)
(обозначено кратко s1, ..., s201)
Все синусы попарно в порядке очереди перемножаются.
и потом суммируются
НО ЕСТЬ ОДНО НО.
Есть одно слагаемое состоящее из Трёх синусов
При этом это слагаемое может быть в любой месте
нашего выражения (быть первый, в середине, в конце)
Требуется определить максимум этого выражения
(найти число k - положение тройки синусов) и вывести
результат на экран.

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  s1*s2 +...+ sk*s(k+1)*s(k+2) +...+ s200*s201
REM
REM   (s = SIN)  Max = 53.4653  k = 143
REM
 
CLS
 
FOR k = 1 TO 199 STEP 2
   S = 0
   S = SIN(k) * SIN(k + 1) * SIN(k + 2)
 
   FOR i = 1 TO k - 1
      S = S + SIN(i) * SIN(i + 1)
   NEXT
 
   FOR i = k + 3 TO 200
      S = S + SIN(i) * SIN(i + 1)
   NEXT
 
   IF max < S THEN
      max = S
      km = k
   END IF
NEXT k
 
PRINT S; km
END
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.03.2017, 10:08
Ответы с готовыми решениями:

Найти максимум числового выражения
Задано числовое выражение (sin1 + ... + sin(k)) * (sin(k+1) + ... + sin(n)) в двух скобках проставлены суммы синусов от чисел ...

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

Найти сумму числового ряда (2)
Дан конечный числовой ряд 1/2 + (3 + 4)/(5 + 6) + (7 + 8 + 9)/(10 + 11 + 12) + .... Всего ровно 100 слагаемых. Вот их и надо...

7
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
06.03.2017, 09:56
Лучший ответ Сообщение было отмечено echs как решение

Решение

не четко сформулирована задача, как правильно должно быть?
s1*s2 + s2*s3 + s3*s4 + ...
или
s1*s2 + s3*s4 + s5*s6 + ...

Если второй вариант, то задача решена не верно
в 13й и 17й строках должно быть указано Step 2
строка 10 - лишняя
в 27й строке нужно выводить Max, а не S

к тому же код не рациональный, потребуется очень много времени, если, например, нужно считать не до 201, а до 10000
Задача имеет сложность О(N), а не O(N^2), как реализовано в Вашем решении:
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
DIM i AS LONG, s1 AS DOUBLE, s2 AS DOUBLE, s AS DOUBLE, sm AS DOUBLE, km AS LONG
CONST n AS LONG = 201
FOR i = 1 TO n - 2 STEP 2
    s2 = s2 + SIN(i + 1) * SIN(i + 2)
NEXT i
FOR i = 1 TO n - 2 STEP 2
    s2 = s2 - SIN(i + 1) * SIN(i + 2)
    s = s1 + SIN(i) * SIN(i + 1) * SIN(i + 2) + s2
    s1 = s1 + SIN(i) * SIN(i + 1)
    IF i = 1 OR s > sm THEN sm = s: km = i
NEXT i
PRINT sm, km
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
06.03.2017, 11:09  [ТС]
m-ch
СПАСИБО! Вы правы я пропустил ключевое слово STEP 2.
...
m-ch
Но мне ваш код что-то непонятен. Кажется (!!)
там что-то либо лишнее, либо пропущено...
Такое ощущение... ведь слагаемое с тремя синусами
должно разрывать на части этот ряд. Ибо две части
(две суммы) имеют разное начало и конец суммирования...
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
06.03.2017, 11:28
Лучший ответ Сообщение было отмечено echs как решение

Решение

Цитата Сообщение от echs Посмотреть сообщение
ведь слагаемое с тремя синусами
должно разрывать на части этот ряд.
Проанализируйте 8ю строчку кода, там как раз и идет разрыв ряда
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
06.03.2017, 14:14  [ТС]
m-ch
Спасибо еще раз! Однако честно говоря,
код очень мудрёный. Даже сейчас я понимаю,
что зная его, я его не сумею повторить.
Но все-равно спасибо!! Для меня это недоступная
вершина...

Добавлено через 1 минуту
m-ch
А нельзя ли в трёх словах описать алгоритм?
Наверное я скорее пойму.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
06.03.2017, 15:12
Лучший ответ Сообщение было отмечено echs как решение

Решение

По переменным:
в S1 храним сумму произведений синусов до i-го элемента:
sin1*sin2 + sin3*sin4 + ... + sin(i-2)*sin(i-1)

в переменной S2 храним сумму произведений оставшихся синусов после i+2
sin(i+3)*sin(i+4) + sin(i+5)*sin(i+6) + ... + sin200*sin201

для этого мы вначале вычисляем s2 для всего ряда (строки 3-5)
далее в цикле (строки 6-11) на каждом шаге вычисляем текущее значение s1 и s2
в 8й строке вычисляем значение суммы ряда, где три синуса вычисляются для i-го значения, а переменные s1 и s2 вычисляются накопительным итогом от предыдущих вычислений.

если сложность алгоритма приравнять к количеству, сколько раз вызывается функция Sin, то в моем варианте количество вызовов изменяется линейно от n:
K = (n-1)/2*9

В Вашем же алгоритме - квадратичная зависимость:
K = (((n-1)/2)^2+1)*3-n

поэтому с ростом N, Ваш алгоритм будет сильно тормозить.

Добавлено через 4 минуты
Мой код можно немного сократить по количеству вычислений (используя только один цикл):
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
DIM i AS LONG, s1 AS DOUBLE, s2 AS DOUBLE, s AS DOUBLE, sm AS DOUBLE, km AS LONG
CONST n AS LONG = 201
FOR i = 1 TO n - 2 STEP 2
    s2 = s2 - SIN(i + 1) * SIN(i + 2)
    s = s1 + SIN(i) * SIN(i + 1) * SIN(i + 2) + s2
    s1 = s1 + SIN(i) * SIN(i + 1)
    IF i = 1 OR s > sm THEN sm = s: km = i
NEXT i
sm = sm - s2
PRINT sm, km
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
06.03.2017, 17:37  [ТС]
m-ch
Спасибо!! Я вновь потрясён вашей логикой!
Вы излагаете кратко, просто и очень понятно!
Невероятно! Я так вам признателен!...
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
07.03.2017, 08:08
В предыдущем коде, функция Sin вызывалась (n-1)/2*7 = 700 раз
на самом деле необходимо вычисления делать только n (201) раз, все остальные вычисления синусов - дублируются.
Учитывая, что тригонометрические функции не очень быстрые, можно свести к минимуму их вызов:
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DIM i AS LONG, s1 AS DOUBLE, s2 AS DOUBLE, s AS DOUBLE, sm AS DOUBLE, km AS LONG
DIM sn1 AS DOUBLE, sn2 AS DOUBLE, sn3 AS DOUBLE
CONST n AS LONG = 201
sn1 = SIN(1)
FOR i = 1 TO n - 2 STEP 2
    sn2 = SIN(i + 1)
    sn3 = SIN(i + 2)
    s2 = s2 - sn2 * sn3
    s = s1 + sn1 * sn2 * sn3 + s2
    s1 = s1 + sn1 * sn2
    IF i = 1 OR s > sm THEN sm = s: km = i
    sn1 = sn3
NEXT i
sm = sm - s2
PRINT sm, km
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.03.2017, 08:08
Помогаю со студенческими работами здесь

Найти сумму числового ряда
Задан ряд 1 + 2/(3*4) + (5*6)/(7*8*9) + (10*11*12)/(13*14*15*16) + ... Всего 25 слагаемых (625 натуральных чисел) Алгоритм ряда...

Найти наибольший элемент числового массива
1) Вывести элементы массива, состоящего из 10 элементов, с чётными и нечётными номерами. 2) Составить программу для проверки...

Найти локальный максимум
дан 2-мерный массив. Найти локальный максимум, если он есть заменить его на противоположный по знаку

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью 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 ). Также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru