1 / 0 / 0
Регистрация: 08.12.2010
Сообщений: 15
1

Даны два массива x[1] <= ... <= x[k], y[1] <= ... <= y[l].

16.12.2010, 00:10. Показов 2683. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Даны два массива x[1] <= ... <= x[k], y[1] <= ... <= y[l].
Найти их "пересечение", т.е. массив z[1] <= ... <= z[m],
содержащий их общие элементы, причем, кратность каждого элемента
в массиве z равняется минимуму из его кратностей в массивах x и y.
Число действий должно быть порядка k+l.

Ниже Код, выполненый на ПасКАЛЕ, помогите в C# перевести... С синтаксисом никак не могу разобраться

Pascal
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
 {
 Даны два массива x[1] <= ... <= x[k], y[1] <= ... <= y[l].
 Найти их "пересечение", т.е. массив z[1] <= ... <= z[m],
 содержащий их общие элементы, причем, кратность каждого элемента
 в массиве z равняется минимуму из его кратностей в массивах x и y.
 Число действий должно быть порядка k+l. 
}
Program InterSect;
 
Const
  cMaxIndex = 100; { максимальное число элементов для определения массива }
 
Type
  TIndex = 1..cMaxIndex;                 { тип для описания индекса }
  TArray = array [0..cMaxIndex] of Word; { описание массива. Элемент с индексом 0 - верхняя граница массива }
 
Var
  x : TArray; { массив x }
  y : TArray; { массив y }
  z : TArray; { массив z }
 
{ Процедура печати массива }
Procedure Print (a : TArray; title : string);
var
  i : TIndex;
 
begin
  write (title, ':');
  for i := 1 to a [0] do
    write (' ', a [i]);
  writeln;
end;
 
{ Процедура ввода массива }
Procedure Input (var a : TArray; title : string);
var
  i : TIndex;
 
begin
  writeln ('Введите элементы массива ', title, ' (не более ', cMaxIndex, ' элементов). Введите 0 для окончания ввода');
  
  a [0] := 0;
 
  for i := 1 to cMaxIndex do
  begin
    readln (a [i]);
    if a [i] = 0 then break
    else Inc (a [0]);
  end;
end;
 
{ Процедура для вормирования "пересечения" массивов }
Procedure InterSection (a : TArray; b : TArray; var c : TArray);
var
  i : TIndex; { переменная для перебора элементов первого массива }
  j : TIndex; { переменная для перебора элементов второго массива }
 
  n : TIndex; { количество элементов первого массива }
  m : TIndex; { количество элементов второго массива }
 
begin
  n := a [0];
  m := b [0];
 
  c [0] := 0;
  j := 1;
  i := 1;
 
  { пока есть элементы в первом массиве }
  while i <= n do
  begin
    { находим первый элемент во втором массиве, который не меньше текущего из первого }
    while (j <= m) and (b [j] < a [i]) do Inc (j);
    if j > m then break;
 
    { добавляем одинаковые элементы в третий массив (меньшая кратность получается автоматически) }
    while a [i] = b [j] do
    begin
      { Заносим элемент в массив c }
      Inc (c [0]);
      c [c [0]] := a [i];
 
      { переходим к следующим элементам исходных массивов }
      Inc (i);
      Inc (j);
 
      { проверяем границы массивов }
      if (i > n) or (j > m) then break;
    end;
 
    { пропускаем элементы первого массива до тех пор, пока очередной элемент не станет больше или равен текущего элемента второго массива }
    while (i <= n) and (a [i] < b [j]) do Inc (i);  
  end;
end;
 
Begin
  Input (x, 'x');
  Input (y, 'y');
 
  Print (x, 'x');
  Print (y, 'y');
 
  InterSection (x, y, z);
 
  Print (z, 'z');
End.
Добавлено через 7 часов 6 минут
Вот подразобрался с написанием массивов х и у, а как из них выбрать массив z:?
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
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            
            int k = Convert.ToInt32(Console.ReadLine());
            int l = Convert.ToInt32(Console.ReadLine());
            double []x=new double[k];
            double[] y = new double[l];
            double m = k + l;
            Random a = new Random();
            for (int i = 0; i < k; i++)
            {                
                    x.SetValue(a.Next(0, 10), i);
            }
            for (int j = 0; j < l; j++)
            {
                y.SetValue(a.Next(0, 10),j);
            }
 
 
            for (int i = 0; i < k; i++)
            {
                    Console.Write("  " + x[i]);
            } 
            Console.WriteLine();
            for (int j = 0; j < l; j++)
            {
                   Console.Write("  " + y[j]);
            }
            
 
 
 
 
        }
    }
}
как найти их "пересечение", т.е. массив z[1] <= ... <= z[m],содержащий их общие элементы, причем, кратность каждого элемента в массиве z равняется минимуму из его кратностей в массивах x и y,число действий должно быть порядка k+l. :? 0_о
 Комментарий модератора 
Кросспостинг запрещен правилами - п. 3.4.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2010, 00:10
Ответы с готовыми решениями:

Даны два одномерных массива целых чисел. Сформировать из них два новых по правилу
Помогите пожалуйста с задачей:help: :) Даны два одномерных массива целых чисел (массив А,...

Даны два массива. Сформируйте массив С, состоящий из общих элементов массива А и В
Даны два массива: массив А из n элементов и массив В из m элементов. Сформируйте массив С,...

Даны два массива: А(10) и В(10) образуйте массив С, состоящий из сумм соответствующих элементов массива А и В
Даны два массива: А(10) и В(10) образуйте массив С, состоящий из сумм соответствующих элементов...

Даны два массива. Сколько раз элементы первого массива повторяются во втором
Даны два массива. Сколько раз элементы первого массива повторяются во втором? Где то надо немного...

4
Заблокирован
16.12.2010, 00:37 2
Цитата Сообщение от EduDo Посмотреть сообщение
как найти их "пересечение"
Вот пример нахождения пересечения двух массивов
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Linq;
 
public class MainClass{
   public static void Main(){
            int[] numbers = {1, 1, 2, 3, 3};
            int[] numbers2 = {1, 3, 3, 4};
var V = numbers.Intersect(numbers2);
foreach ( var v in V)
            Console.WriteLine(v);
Console.ReadLine(); 
   }
}
0
1 / 0 / 0
Регистрация: 08.12.2010
Сообщений: 15
16.12.2010, 10:03  [ТС] 3
Итак, спустя вечер получилось построить массив z (пересечение х и у).

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
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            int t = 0;
            int k = Convert.ToInt32(Console.ReadLine());
            int l = Convert.ToInt32(Console.ReadLine());
            double[] x = new double[k];
            double[] y = new double[l];
            double m = k + l;
            Random a = new Random();
            for (int i = 0; i < k; i++)
            {
                x.SetValue(a.Next(0, 10), i);
            }
            for (int j = 0; j < l; j++)
            {
                y.SetValue(a.Next(0, 10), j);
            }
            for (int i = 0; i < k; i++)
            {
                Console.Write("  " + x[i]);
            }
            Console.WriteLine();
            for (int j = 0; j < l; j++)
            {
                Console.Write("  " + y[j]);
            }
 
            Console.WriteLine(); Console.WriteLine();
            double[] z = new double[k * l];    // ograni4enie possledovatelnostu
            for (int i = 0; i < k; i++)        //proveraem perese4enie i zapusyvaem kak maccub
            {
                for (int j = 0; j < l; j++)
                {
                    if (x[i] == y[j])
                    {
                        
                        z.SetValue(x[i], t); Console.Write("  " + z[t]);
                        t++;
                    }
                }
            }
        }
    }
}

Но немогу догнать как так: кратность каждого элемента в массиве z равняется минимуму из его кратностей в массивах x и y, число действий должно быть порядка k+l

ДАЙТЕ НАПРАВЛЕНИЕ ЧЕМ ВОСПОЛЬЗОВАТЬСЯ И КАК ПРАВИЛЬНО ОТЛАДИТЬ ПРОГРАММУ ПО УСЛОВИЮ ЗАДАНИЯ:?

Добавлено через 8 часов 4 минуты
SSV по условию задания мне надо найти не просто пересечение массива х и у, а массив z, содержащий общие элементы х,у, причем, кратность каждого элемента в массиве z равняется минимуму и т.д.....
0
Заблокирован
16.12.2010, 12:54 4
EduDo, я бы тебе помог, но честно сказать, не совсем понял условие задачи, а разбираться в чужом коде - облом. Если б ты более подробно объяснил или показал на примере, какой должен быть ответ - тогда другое дело.

Добавлено через 1 час 57 минут
Вообщем я решил, так как я понял. Возможно и неправильно. Для меня только осталось не понятным вот это

Цитата Сообщение от EduDo Посмотреть сообщение
Число действий должно быть порядка k+l.
Это каких-таких действий? Насколько мне известно порядок числа это количество цифр в нём. Так что это получается? Если у меня будет первый массив состоять из 9 элементов, а второй из 12 - то надо решить задачу за три действия? Какая-то ерунда. Поправь, если я не правильно понял.

Вот моё решение
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
using System;
using System.Linq;
 
 
    class Program
    {
        static void Main(string[] args)
        {
            Random r = new Random();
            Console.WriteLine("Введите число K и нажмите Ввод");
            int K = int.Parse(Console.ReadLine());
            int[] massK = new int[K];
            Console.WriteLine("Введите число L и нажмите Ввод");
            int L = int.Parse(Console.ReadLine());
            int[] massL = new int[L];
            Console.WriteLine("\nПервый массив\n");
            //Заполняем первый массив и выводим на консоль
            for (int i = 0; i < massK.Length; ++i)
            {
                massK[i] = r.Next(2,20);
                Console.Write(massK[i] + " ");
            }
            Console.WriteLine("\nВторой массив\n");
            //Заполняем второй массив и выводим на консоль
            for (int i = 0; i < massL.Length; ++i)
            {
                massL[i] = r.Next(3, 25);
                Console.Write(massL[i] + " ");
            }
            Console.WriteLine("\nОбщие элементы\n");
            //Находим общие элементы
            var V = massK.Intersect(massL);
            foreach (var v in V)
                Console.WriteLine(v);
            //Находим минимальные элементы в обоих массивах
            int min_massK = massK.Min();
            Console.WriteLine("\nМинимальный элемент первого массива -> {0}\n", min_massK);
            int min_massL = massL.Min();
            int count = 0;
            Console.WriteLine("\nМинимальный элемент второго массива -> {0}\n", min_massL);
            //Находим из общих элементов элементы кратные минимальным элементам двух массивов
            Console.WriteLine("\nЭлементы кратные минимальным элементам двух массивов\n");
            foreach (var v in V)
            {
                double d = ((double)v / (double)min_massK);
                double d2 = ((double)v / (double)min_massL);
                if (d - (int)d == 0 && d2 - (int)d2 == 0)
                {
                    ++count;
                    Console.WriteLine(v);
                }
            }
            if(count == 0)
                Console.WriteLine("\nТаких элементов нет");
            Console.ReadLine();
        }
    }
1
1 / 0 / 0
Регистрация: 08.12.2010
Сообщений: 15
17.12.2010, 00:38  [ТС] 5
SSV , благодарю за помощь +1, толь вот я сам догнать немагу: Число действий должно быть порядка k+l
0
17.12.2010, 00:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2010, 00:38
Помогаю со студенческими работами здесь

Даны два массива. Получить элементы массива C по формуле
А=(-3.4, 4, 6, 0.233, -11.23, -7, 5, -1.99); B=(33, -1.2, 7, -5, 11.11, -2.3, 6.01, -3.2). Получить...

Даны два целочисленных массива K(m) и L(n). Найти наименьший элемент массива K, не имеющий себе равных в массиве L
Даны два целочисленных массива K(m) и L(n). Найти наименьший элемент массива K, не имеющий себе...

Даны два целочисленных массива A(m) и B(n). Найти наибольший элемент массива А, не имеющий себе равных в массиве В.
Даны два целочисленных массива A(m) и B(n). Найти наибольший элемент массива А, не имеющий себе...

Выдает ошибку ! Даны два массива. Найти отклонение медианы от среднего арифметического для третьего массива
3. Даны два массива. Найти отклонение медианы от среднего арифметического для третьего массива,...

Даны два массива A и C
Даны два массива A и C, состоящие из N элементов каждый. Определить наименьшую абсолютную величину...

Даны два массива
Даны два массива: $a = array(&quot;и&quot;=&gt;&quot;Информатика&quot;, &quot;м&quot;=&gt;&quot;Математика&quot;); $b =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru