Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Несколько тривиальных задач из школьного курса / 9 сообщений из 9, страница 1 из 1
03.10.2014, 12:20
    #38765900
BlackStone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько тривиальных задач из школьного курса
Привет форумчани!
Волей случая пришлось мне решить несколько простых алгоритмических задач, мне это было интересно с целью «умственной» гимнастики, так сказать «пошевелить» извилины, предлагаю желающим последовать моему примеру и предложить свои варианты решений, было бы интересно увидеть новые варианты или получить замечания по текущим. Для реализации алгоритмов я выбрал C# и T-SQL, хотя каждый волен писать на том, что ему больше подходит.

Задача
Объявлены две числовые переменные A и B. Необходимо сделать так, чтобы без объявления других переменных в результате работы алгоритма переменная A приняла минимальное значение из A и B, а переменная B – максимальное. Применять можно только операции присваивания, арифметические операции и любые стандартные математические функции (использование операторов запрещено).
Решение
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
static void Main(string[] args)
{
    int A = 100;
    int B = 50;           

    Console.WriteLine("Начальные значения:\t A={0}, B={1}",A,B);

    A = A + B;
    B = A - (int)Math.Pow((A - B) / (A - (A - B)), ((A - (A - B)) / (A - B))) * B - (int)Math.Pow((A - (A - B)) / (A - B), (A - B) / (A - (A - B))) * (A - B);
    A = A - B;

    Console.WriteLine("Конечные значения:\t A={0}, B={1}", A, B);

    Console.ReadKey();
}



Задача
За один цикл вычислить значение функции F(n)=1!*2!*…*n! , где n! – факториал (1*2*…*n)
Решение
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
        
static int Factorial(int ANumber)
{
    int AValue = 1;

    for (int Idx = 2; Idx <= ANumber; Idx++)
    {
        AValue = AValue * Idx;
    }

    return AValue * (ANumber > 1 ? Factorial(ANumber - 1) : 1);
}

static void Main(string[] args)
{
    byte N = 4;
    Console.WriteLine("Результат:{0}", Factorial(N));
    Console.ReadKey();
}



Задача
Определить число k, которое отсутствует в неупорядоченном массиве чисел (0, 1,...k-1,k+1,...n) за один цикл
Решение
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
static void Main(string[] args)
{
    int[] A = new int[10] { 0, 3, 2, 5, 4, 6, 8, 9, 10, 1 };

    int? K = null; int J = 0;
    for (int I = 0; I < A.Length; I++)
    {
        if (K != null)
        {
            if (A[I] == K)
            {
                I = J; K = null;
            }
        }
        else if (I < A.Length - 1 && A[I] + 1 == A[I + 1] - 1)
        {
            K = A[I] + 1; J = I; I = 0;
        }
    }
    Console.WriteLine("{0}", K);

    Console.ReadKey();
}



Задача
Задана таблица T ( ID Int, String VarChar(MAX) )
и произвольную строку @StrSearch. Необходимо вывести следующую информацию в виде: [ID] [String] [Quantity] [Percent], где
[ID] [String] - поля таблицы T, в которых присутствуют совпадения со строкой @StrSearch
[Quantity] количество встречающихся совпадений по каждой записи для строки @StrSearch
[Percent] процент количества совпадений для каждой записи от общего количества совпадений по всей таблице
Решение
Код: sql
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.
29.
30.
31.
32.
33.
34.
35.
DECLARE @T TABLE 
(
  [ID] Int IDENTITY(1,1),
  [String] VarChar(200) 
) 

INSERT INTO @T([String]) VALUES
('мама мыла раму'),
('раму мыла мама'),
('мама раму мыла и мыла и мыла...')

DECLARE @StrSearch VarChar(100) = 'мыла'

;WITH CTE AS 
(
  SELECT 
   [ID],
   [String]     = CAST(SUBSTRING ( [String], 1, CHARINDEX ( @StrSearch, [String] ) - 1 ) + SUBSTRING ( [String], CHARINDEX ( @StrSearch, [String] ) + LEN ( @StrSearch ), LEN ( [String] ) ) AS VarChar(200)),
   [Count]      = 1
  FROM   @T
  WHERE  CHARINDEX ( @StrSearch, [String] ) > 0
  UNION ALL 
  SELECT 
   [ID]         = CTE.[ID],
   [String]     = CAST(SUBSTRING ( CTE.[String], 1, CHARINDEX ( @StrSearch, CTE.[String] ) - 1 ) + SUBSTRING ( CTE.[String], CHARINDEX ( @StrSearch, CTE.[String] ) + LEN ( @StrSearch ), LEN ( CTE.[String] ) ) AS VarChar(200)),
   [Count]      = [Count] + 1
  FROM   CTE 
  INNER JOIN @T T ON T.[ID] = CTE.[ID] 
  WHERE  CHARINDEX ( @StrSearch, CTE.[String] ) > 0
) 
SELECT 
  '[ ' + CAST(T.[ID] AS VarChar) + ' ] [ ' + T.[String] + ' ] [ ' + CAST(ISNULL(Q.[Value], 0) AS VarChar) + ' ] [ ' + CAST(ISNULL(Q.[Value] * 100 / M.[Value], 0) AS VarChar) + '% ]'
FROM @T T
LEFT  JOIN (SELECT [Value] = SUM([Value]) FROM (SELECT [Value] = MAX([Count]) FROM CTE GROUP BY [ID]) T) M ON 1 = 1
OUTER APPLY (SELECT [Value] = MAX([Count]) FROM CTE WHERE [ID] = T.[ID]) Q
...
Рейтинг: 0 / 0
03.10.2014, 13:28
    #38766033
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько тривиальных задач из школьного курса
во второй задаче (в решении) итоговая сложность явно больше одного цикла.
там надо примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
static int Factorial(int ANumber)
{
    int currentFac = 1;
    int p = 1;

    for (int Idx = 2; Idx <= ANumber; Idx++)
    {
        currentFac = currentFac * Idx;
        p = p * currentFac;
    }

    return p;
}




третья тоже неверно (если переставить 6 и 8 местами, остается нулл). Там всё просто - из n*(n-1)/2 вычитаем сумму элементов массива, полученную в цикле.
...
Рейтинг: 0 / 0
03.10.2014, 14:07
    #38766110
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько тривиальных задач из школьного курса
BlackStoneОбъявлены две числовые переменные A и B. Необходимо сделать так, чтобы без объявления других переменных в результате работы алгоритма переменная A приняла минимальное значение из A и B, а переменная B – максимальное. Применять можно только операции присваивания, арифметические операции и любые стандартные математические функции (использование операторов запрещено).
Код: vbnet
1.
2.
3.
A = A + B 
B = A - SQRT((A-2*B)^2)
A = A - B
...
Рейтинг: 0 / 0
03.10.2014, 14:57
    #38766173
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько тривиальных задач из школьного курса
Ну и автор нафлудил букв.

Ладно. Вопрос.
Объявлены две числовые переменные A и B. Необходимо сделать так, чтобы без объявления других переменных в результате работы алгоритма переменная A приняла минимальное значение из A и B, а переменная B – максимальное. Применять можно только операции присваивания, арифметические операции и любые стандартные математические функции ( использование операторов запрещено ).
Насколько я понял речь идёт о своей реализации max(a,b), min(a,b).
Из курса булевой алгебры я помню что AND/OR аналогичны max/min
в пространстве одномерной булевой переменной. Можно на этом сыграть.

Но вопросы по тексту. Почему нельзя использовать "операторы"? Плюс
и Минут - это операторы? А коньюнкция дизъюнкция?

А квадратный корень - операция? Или функция?

А ветвления? Основные строительные блоки алгоритмов? if-else.
А тернарные операции?
...
Рейтинг: 0 / 0
03.10.2014, 15:24
    #38766202
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько тривиальных задач из школьного курса
AkinaBlackStoneОбъявлены две числовые переменные A и B. Необходимо сделать так, чтобы без объявления других переменных в результате работы алгоритма переменная A приняла минимальное значение из A и B, а переменная B – максимальное. Применять можно только операции присваивания, арифметические операции и любые стандартные математические функции (использование операторов запрещено).
Код: vbnet
1.
2.
3.
A = A + B 
B = A - SQRT((A-2*B)^2)
A = A - B

для (5,3) не работает - В станет равно 6.

вот так вроде норм.:
Код: c#
1.
2.
3.
4.
A = A + B;
B = Abs(A-2*B);
A = (A - B) / 2;
B = А + В;



Abs - абсолютная величина, если чо - заменяем на SQRT((A-2*B)^2)
...
Рейтинг: 0 / 0
31.10.2014, 17:53
    #38793304
BlackStone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько тривиальных задач из школьного курса
Большой спасибо Яростному Мечу за толковые пояснения к решению предложенных задач, хотелось бы отметить, что по условию второй задачи не допускалось использование второго цыкла, а использование рекурсии не оговаривалось, хотя соглашусь, что вполне можно было обойтись без нее.
...
Рейтинг: 0 / 0
31.10.2014, 18:19
    #38793325
BlackStone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько тривиальных задач из школьного курса
В продолжении темы предлагаю очередную задачу на комбинаторику, условия задачи, представить все возможные комбинации получения целого положительного числа N посредством сложения чисел этого же ряда.
Пример: Получить все возможные комбинации числа 8
Решение:
7+1
6+2
6+1+1
5+3
5+2+1
5+1+1+1
4+4
4+3+1
4+2+1+1
4+1+1+1+1
3+3+2
3+3+1+1
3+2+1+1+1
3+1+1+1+1+1
2+2+2+2
2+2+2+1+1
2+2+1+1+1+1
2+1+1+1+1+1+1
1+1+1+1+1+1+1+1

Решение:
Код: c#
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
 class Program
        {
            private static List<List<int>> NumericSeries(int N)
            {
                List<List<int>> AResult = new List<List<int>>();
                
                List<int> ASeries = new List<int>();

                for(int Idx = 1; Idx < N; Idx++)
                {
                    ASeries.Add(Idx);
                }
                
                List<int> AList = new List<int>();
                int I = ASeries.Count; int Sum = 0;                
                
                do
                {
                    I -= 1;

                    while (true)
                    {
                        if (Sum + ASeries[I] <= N)
                        {
                            AList.Add(ASeries[I]);
                            Sum += ASeries[I];
                        }
                        else
                        {
                            break;
                        }
                    }

                    if (Sum == N)
                    {
                        Sum = 0; I = ASeries.IndexOf(AList[0]); AResult.Add(new List<int>(AList)); AList.Clear();
                    }

                } while (I > 0);

                return AResult;
            }

            static void Main(string[] args)
            {
                int N;

                Console.Write("Введите число:");
                if (int.TryParse(Console.ReadLine(), out N) == true)
                {
                    foreach (List<int> AList in NumericSeries(N))
                    {
                        Console.WriteLine(string.Join("+", AList.ConvertAll(new Converter<int, string>(Convert.ToString)).ToArray()));

                        for (int I = AList.Count - 1; I > 0; I--)
                        {
                            if (AList[I] > 1)
                            {
                                N = AList[I]; AList.RemoveAt(I); AList.InsertRange(I, NumericSeries(N)[0]); I = AList.Count;

                                Console.WriteLine(string.Join("+", AList.ConvertAll(new Converter<int, string>(Convert.ToString)).ToArray()));
                            }
                        }
                    }
                }
                
                Console.ReadKey();
            }
...
Рейтинг: 0 / 0
31.10.2014, 18:45
    #38793338
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько тривиальных задач из школьного курса
BlackStone, а можешь решить эту задачу без использования List<List<int>> ?
...
Рейтинг: 0 / 0
31.10.2014, 19:29
    #38793356
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько тривиальных задач из школьного курса
maytonBlackStone, а можешь решить эту задачу без использования List<List<int>> ?
Рекурсия идеально подходит
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Несколько тривиальных задач из школьного курса / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]