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

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

05.03.2017, 10:08. Показов 1476. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru