Задача.
Дано действительное число [latex]a[/latex]. Вычислить [latex]f(a)[/latex], где [latex]f[/latex] — периодическая функция с периодом 1.5, совпадающая на отрезке [latex][0;1.5][/latex] с функцией [latex]x^{3}-2.25x[/latex].
Тесты:
[latex]a[/latex] | [latex]f(a)[/latex] | Комментарий |
2.12 | -1.15667 | Тест пройден |
-8 | -1.25 | Тест пройден |
11.6 | -1.114 | Тест пройден |
3.7 | -1.232 | Тест пройден |
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <iostream> using namespace std; int main() { float f, a, b; double p=1.5; int c; cin>>a; if(a>=0) { c=a/p; b=a/p; a=(b-c)*p; } else if(a<0) { c=(-a)/p; a=(c+1)*p+a; } f=a*a*a-2.25*a; cout<<f<<endl; return 0; } |
Решение:
Для положительных мы просто приравниваем [latex]a[/latex] к остатку от деления числа [latex]a[/latex] на период [latex]p=1.5[/latex], таким образом мы сдвигаем [latex]a[/latex], влево на необходимое количество[latex]p[/latex] пока [latex]a[/latex] не попадет в отрезок [latex][0;1.5][/latex]. Если число [latex]a[/latex] принадлежит отрезку [latex][0;1.5][/latex], то по данному алгоритму число [latex]a[/latex] останется неизменным.
Для отрицательных чисел мы действуем проще. К левой границе(взятой по модулю) интервала в котором находится число [latex]a[/latex] мы прибавляем число [latex]a[/latex]. Таким образом мы сдвигаем число а соответствующему значению в интервале [latex][0;1.5][/latex] так, что значение функции при этом не меняется.
Например:
[latex]a=-2[/latex] , следовательно она принадлежит отрезку [latex][-3;-1.5][/latex].
берем левую границу [latex]\left|-3 \right|[/latex] и прибавляем a.
[latex]3-2=1.[/latex]
[latex]f(-2)=f(1)[/latex] т.к. функция периодична.
Полученное значение [latex]a[/latex] подставляем в формулу [latex]f(a)=a^{3}-2.25a[/latex] и подсчитываем значение функции.
Ссылка на код