В
Все
М
Математика
О
ОБЖ
У
Українська мова
Х
Химия
Д
Другие предметы
Н
Немецкий язык
Б
Беларуская мова
М
Музыка
Э
Экономика
Ф
Физика
Б
Биология
О
Окружающий мир
У
Українська література
Р
Русский язык
Ф
Французский язык
П
Психология
О
Обществознание
А
Алгебра
М
МХК
Г
География
И
Информатика
П
Право
А
Английский язык
Г
Геометрия
Қ
Қазақ тiлi
Л
Литература
И
История
alina20041002
alina20041002
15.02.2022 01:37 •  Информатика

Алгоритм действий кота Тома по отношению к мышонку Джерри

Показать ответ
Ответ:
песок3
песок3
23.09.2020 20:49

P.S.:

Я уже потом прочел, что все данные вводятся уже в готовом виде.

Но уравнение я уже разложил.

В stdin.txt идет что-то на подобии:

1*3^6+2*3^5-21*3^4-20*3^3+71*3^2+114*3+45=0

(В проге уже все само раскладывается итд)

+ есть левые ответы (не знаю почему, но все работает корректно. Видимо ложные.)

Либо пиши проверку под это дело, либо уменьшай лимиты.

Если не нравится реализация с парсингом значений из уравнения - переписывай, ибо мне лень)))

(Лучше решения тебе явно никто не предложит)

И да - если коаф. 1, то есть что-то на подобии x^2 - 4 * x + 1 =0 (у x^2 коаф. единица), то его вручную нужно прописывать.

using System;

using System.Collections.Generic;

using System.IO;

using System.Text.RegularExpressions;

namespace Test

{

   class Program

   {

       static void Main(string[] args)

       {

           string equation = get_equation();

           int __LIMIT__ = 1000;//Лимит поиска корней.То-есть программа пытается найти корни от 1000 до -1000

           int highest_exponent;

           try

           {

               highest_exponent = int.Parse(get_higher_exponent(equation));

           }

           catch (Exception ex)

           {

               Console.WriteLine("Badequation.");

               return;

           }

           int[] multipliers = get_multipliers(exponents_remover(equation), highest_exponent);

           List<int> answers = gorner_resolver(multipliers, __LIMIT__);

           int k = 1;

           for (int i = 0; i < answers.Count; ++i)

           {

               Console.WriteLine("{0}:{1}", k, answers[i]);

               k++;

           }

           Console.ReadLine();

       }

       static string get_equation()

       {

           return File.ReadAllText("./stdin.txt").Replace(" ", "");

       }

       static string get_higher_exponent(string equation)

       {

           for (int i = 0; i < equation.Length; ++i)

           {

               if (equation[i] == '^')

               {

                   if (equation[i + 1] == '-' || equation[i + 1] == '+')

                       return equation[i + 1].ToString() + equation[i + 2].ToString();

                   return equation[i + 1].ToString();

               }

           }

           return "Bad";

       }

       static string exponents_remover(string equation)

       {

           string eq_x = equation;

           for (int i = 0; i < eq_x.Length; ++i)

           {

               if (eq_x[i] == '^')

               {

                   if (eq_x[i + 1] == '-' || eq_x[i + 1] == '+')

                       eq_x = eq_x.Remove(i + 1, 2);

                   eq_x = eq_x.Remove(i + 1, 1);

               }

           }

           return eq_x.Substring(0, eq_x.Length - 2);

       }

       static List<int> gorner_resolver(int[] multipliers, int limit)

       {

           int k = 1;

           int[] resolve = new int[multipliers.Length];

           List<int> ans = new List<int>();

           while (k <= limit)

           {

               resolve[0] = multipliers[0];

               int coaf = k;

               if (k > 0)

                   k *= -1;

               else

               {

                   k *= -1;

                   k++;

               }

               for (int i = 1; i < multipliers.Length; ++i)

               {

                   resolve[i] = resolve[i - 1] * coaf + multipliers[i];

               }

               if (resolve[resolve.Length - 1] == 0)

                   ans.Add(coaf);

           }

           return ans;

       }

       static int[] get_multipliers(string equation, int highest_exponent)

       {

           Regex re = new Regex(@"-?[0-9]+\*?");

           MatchCollection matches = re.Matches(equation);

           int[] multipliers = new int[highest_exponent + 1];

           int k = 0;

           foreach (var value in matches)

           {

               multipliers[k] = int.Parse(value.ToString().Replace("*", ""));

               k++;

           }

           return multipliers;

       }

   }

}

0,0(0 оценок)
Ответ:
9092005apv
9092005apv
02.11.2022 18:08
Exp(x) - функция, возводящая число е ≈ 2.718 в степень Х.
ln(x) - натуральный логарифм по основанию е из числа Х.
Т.е exp(ln(5)) вернёт 5, exp(ln(10)) вернёт 10 и т.д. В этом случае, число N работает как показатель степени для Х.  Тогда exp(ln(3)*2) = 3^2 = 9. Ведь в математике, чтобы умножить одно число на другое, нужно сложить их логарифмы и результат вернуть "из логарифмов". Пример на десятичных логарифмах: 2 * 2. lg 2 = 0.3010. Чтобы умножить, складываем: 0.3010+0.3010=0.6020. lg 4 = 0.6020. Чтобы возвести число в степень, нужно логарифм числа умножить на показатель степени. Например: 2^8. 0.3010*8=2.408. lg 256 = 2.408. Таким образом ln(x)*n - это умножение логарифма числа на показатель степени, а exp(res) - возведение из логарифма в число. Может быть сумбурно объяснил, но как-то так.
0,0(0 оценок)
Популярные вопросы: Информатика
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота