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

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

05.03.2017, 10:08. Показов 1483. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru