Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Elektrik72
51 / 15 / 7
Регистрация: 09.02.2014
Сообщений: 209

Вывод строк чисел которые не делятся друг на друга

24.04.2022, 13:36. Показов 1209. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Всех с праздником!
Стараюсь не просить помощи с кодом т.к. вся эта затея для личного обучения. Но уже второй день я топчусь на месте и не могу найти выхода, как решить. Задание было следующее. Дано число, мы не знаем заранее какое. Но нужно разложить его на строки и в каждой строке должны быть числа которые не делятся друг на друга! Сразу прошу не кидать мне сюда ваши решения этой задачи! Нужна помощь в конкретном месте, конкретно на моем примере. Я и так знаю что все вы тут крутые кодеры)). Я решил ее по своему но для больших значений, к примеру для 15000 компьютер вычислял 20 минут, значение в 100к я ввести не решил, т.к. уйдут часы. А нужно что бы посчитала 1 миллиард. Значения в 2к считаются за 2.5 секунд. Я решил разбить неизвестное число n на отрезки по 2000 чисел и последовательно выводить на экран. То есть первый пак 1-2000, второй 2001=4000. Сложность в том что счетчик сбрасывается каждый пак начинается опять с 1.
Как сделать что бы в программе сработал этот код
C#
1
lvl1 = arr1.Length + lvl2;
и при повторном вызове метода Inicializ , lvl1 сохранила вычисленное значение?

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
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Nature_numbers
{
    internal class Program
    {
        static int Nature(int n)  //метод инициализации первого листа и передача выполнения методу заполнения строк
        {
             
          
            int n_split = 0;
           
 
            int Inicializ(int n_inicializ, int n_inic)
            {
                int step1 = 1;
                int lvl1 = 1;
                int lvl2 = lvl1;
              
               
 
                int[] arr1 = new int[n_inicializ];
 
                List<int> list = new List<int>(); // в лист хранятся отсортированные данные массива, в первом цикле начальные данные
                                                  // для передачи их в массив
                
                /////////////////////////////////////////////
                for (int i = 0; i < arr1.Length; i++)
                {
 
                    arr1[i] = lvl1++;
                    if (arr1[i] != 1) list.Add(arr1[i]);  // заполняем  исходный лист, что бы потом из него удалить лишнее числа
                }
                if (arr1[0] == 1)
                {
                    Console.WriteLine($"Строка № 1 \n {arr1[0]}");
                }
               
                lvl1 = arr1.Length + lvl2; // [B]как сделать что бы программа дошла до этого кода и вернула его в эту же функцию[/B]
                //////////////////////////////////////////////////
 
                return List_num(list, n_inic);
                
            }
            if (n >= 3000)
            {
                 
                n_split = 1999;
                //n = n - 2000;
                return Inicializ(n_split, n);
 
                //////////////////////////////////////////////////
 
            }
            else
            {
                n_split = n;
                return Inicializ(n_split, n);
            }
        }
 
        static int List_num(List<int> list, int n_list)
        {
            int count = 1;
            DateTime dt = DateTime.Now;
            int n_count = list.Count;
 
            while (list.Count > 0)
            {
                count++;
                Console.WriteLine();
                List<int> list2 = new List<int>(); // создаем буферный лист в него мы складируем числа которые делятся друг на друга
                                                   // что бы в следующем цикле взять эти числа за исходные данные
 
                int[] arr1 = list.ToArray();  // заносим в массив данные из начального листа который мы заполнили в методе Nature
                list.Clear(); // очищаем лист, что бы потом заполнить его правильными данными
                              ////////////////////////////////////////////
                for (int i = 0; i < arr1.Length; i++)
                {
                    list2.Add(arr1[i]);
                    for (int j = 0; j < arr1.Length; j++) // проводим те же самые операции циклично
                    {
                        int l_numb = list.IndexOf(arr1[i]);  // проверка на повторные данные
 
 
                        if (arr1[j] != 1 && arr1[i] % arr1[j] == 0 && arr1[i] != arr1[j] && l_numb == -1)
                        {
                            list.Add(arr1[i]); // заносим в лист числа которые деляться друг на друга
                        }
                    }
                }
                ////////////////////////////////////////////
                for (int i = 0; i < list2.Count; i++)
                {
                    for (int j = 0; j < list.Count; j++)
                    {
                        if (list2[i] == list[j]) // из исходного листа удаляем  числа которые делятся друг на друга, что бы 
                                                 // получить числа которые не делятся друг на друга
                        {
                            list2.Remove(list2[i]);
                        }
                    }
                }
                ////////////////////////////////////////////
                Console.WriteLine($"Строка  № {count}");
                foreach (var i in list2)
                {
                    Console.Write($"{i} ");
                }
                Console.WriteLine();
                
            }
 
            TimeSpan span = DateTime.Now.Subtract(dt);
            Console.WriteLine($"\nВремя работы программы: {span.TotalSeconds} сек.");
            
            if (n_list >= 1999) return Nature(n_list - 1999);
            else return 1;
        }
        static void Main(string[] args)
        {
            Console.Write("Ведите число: ");
            int n = int.Parse(Console.ReadLine());
            
            Nature(n);
            Console.ReadKey();
            Console.ReadKey();
        }
    }
}
Добавлено через 8 минут
А то получается программа вычисляет значение lvl1 но при повторном вызове опять принимает значение при обьявлении - 0. А передать вычисленное значение
C#
1
lvl1 = arr1.Length + lvl2;
в качестве аргумента никак не получается.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.04.2022, 13:36
Ответы с готовыми решениями:

Вывод чисел из диапазона a и b, которые делятся на 7, но не делятся на 13
В задании дано написать функцию, выводящую из заданного диапазона а и b числа , которые делятся на 7 , но не делятся на 13. По методичке...

Найдите n пар простых чисел, которые отличаются друг от друга на 2.
Найдите n пар простых чисел, которые отличаются друг от друга на 2.

Найдите n пар простых чисел, которые отличаются друг от друга на 2
Здравствуйте, помогите решить такую задачу: Найдите n пар простых чисел, которые отличаются друг от друга на 2.

5
2810 / 1679 / 885
Регистрация: 14.04.2015
Сообщений: 5,723
24.04.2022, 14:48
Elektrik72, из чисел от 0 до 20 какие должны остаться?
0
 Аватар для Elektrik72
51 / 15 / 7
Регистрация: 09.02.2014
Сообщений: 209
24.04.2022, 15:07  [ТС]
AndreyVorobey
0
 Аватар для Elektrik72
51 / 15 / 7
Регистрация: 09.02.2014
Сообщений: 209
24.04.2022, 23:58  [ТС]
Все разобрался. Что бы переменная каждый раз заново не инициализировалась внутри вызываемого метода, ее надо объявить снаружи сделав публичной вот так
C#
1
public static int lvl1 = 1;
В целом код заработал как я хотел, делит число на заданные отрезки чисел и эти отрезки обрабатывает на предмет делится ли это число на число в этой же строке.

Тока не уверен что это правильно решение. Т.к. немного нечестно, ведь по идее каждая строка должна себя включать весь диапазон чисел этого числа которые не делятся друг на друга. А данный алгоритм если убрать деление на паки, не может вычислить значение и в 100к ( слишком долго). Наверное надо было копать в другую сторону и полностью менять алгоритм чем пытаться хитрить с этим.

На всякий случай выложу что в итоге получилось

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
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Nature_numbers
{
    internal class Program
    {
        public static DateTime dt = DateTime.Now;
        public static int count = 1;
        public static int lvl1 = 1;
        public static int Nature(int n)  //метод инициализации первого листа и передача выполнения методу заполнения строк
        {
           int n_split = 0;
            if (n >= 7000)
            {
 
                n_split = 5999;
                //n = n - 2000;
                return Inicializ(n_split, n);
 
                //////////////////////////////////////////////////
 
            }
            else
            {
                n_split = n;
                return Inicializ(n_split, n);
            }
        }
        static int Inicializ(int n_inicializ, int n_inic)
        {
            int lvl2 = lvl1;
            int[] arr1 = new int[n_inicializ];
 
            List<int> list = new List<int>(); // в лист хранятся отсортированные данные массива, в первом цикле начальные данные
                                              // для передачи их в массив
 
            /////////////////////////////////////////////
            for (int i = 0; i < arr1.Length; i++)
            {
 
                arr1[i] = lvl1++;
                if (arr1[i] != 1) list.Add(arr1[i]);  // заполняем  исходный лист, что бы потом из него удалить лишнее числа
            }
            if (arr1[0] == 1)
            {
                Console.WriteLine($"Строка № 1 \n {arr1[0]}");
            }
 
            lvl1 = arr1.Length + lvl2; // как сделать что бы программа дошла до этого кода и вернула его в эту же функцию
                                       //////////////////////////////////////////////////
 
            return List_num(list, n_inic);
 
        }
           
static int List_num(List<int> list, int n_list)
        {
            
           
            int n_count = list.Count;
 
            while (list.Count > 0)
            {
                count++;
                Console.WriteLine();
                List<int> list2 = new List<int>(); // создаем буферный лист в него мы складируем числа которые делятся друг на друга
                                                   // что бы в следующем цикле взять эти числа за исходные данные
 
                int[] arr1 = list.ToArray();  // заносим в массив данные из начального листа который мы заполнили в методе Nature
                list.Clear(); // очищаем лист, что бы потом заполнить его правильными данными
                              ////////////////////////////////////////////
                for (int i = 0; i < arr1.Length; i++)
                {
                    list2.Add(arr1[i]);
                    for (int j = 0; j < arr1.Length; j++) // проводим те же самые операции циклично
                    {
                        int l_numb = list.IndexOf(arr1[i]);  // проверка на повторные данные
                        if (arr1[j] != 1 && arr1[i] % arr1[j] == 0 && arr1[i] != arr1[j] && l_numb == -1)
                        {
                            list.Add(arr1[i]); // заносим в лист числа которые деляться друг на друга
                        }
                    }
                }
                ////////////////////////////////////////////
                for (int i = 0; i < list2.Count; i++)
                {
                    for (int j = 0; j < list.Count; j++)
                    {
                        if (list2[i] == list[j]) // из исходного листа удаляем  числа которые делятся друг на друга, что бы 
                                                 // получить числа которые не делятся друг на друга
                        {
                            list2.Remove(list2[i]);
                        }
                    }
                }
                ////////////////////////////////////////////
                Console.WriteLine($"Строка  № {count}");
                foreach (var i in list2)
                {
                    Console.Write($"{i} ");
                }
                Console.WriteLine();
            }
 
            TimeSpan span = DateTime.Now.Subtract(dt);
            Console.WriteLine($"\nВремя работы программы: {span.TotalSeconds} сек.");
            
            if (n_list >= 7000) return Nature(n_list - 5999);
            else return 1;
        }
        static void Main(string[] args)
        {
            
            Console.Write("Ведите число: ");
            int n = int.Parse(Console.ReadLine());
            
            Nature(n);
            Console.ReadKey();
            Console.ReadKey();
        }
    }
}
0
2810 / 1679 / 885
Регистрация: 14.04.2015
Сообщений: 5,723
25.04.2022, 01:46
Лучший ответ Сообщение было отмечено Elektrik72 как решение

Решение

Elektrik72, вот, например, как я это вижу. идем с конца, чтоб уменьшить количество списков с набором цифр. на каждом этапе чистим исходный список, пока он не превратится в число 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
List<List<int>> vs = new List<List<int>>();
 
List<int> nums = Enumerable.Range(1, 15000).ToList();
 
while (nums.Count() > 1)
{
    List<int> ls = new List<int>();
 
    for (int i = nums.Count - 1; i > 0; i--)
    {
        if (ls.All(a => a % nums[i] != 0))
        {
            ls.Add(nums[i]);
        }
    }
    vs.Add(ls);
 
    nums.RemoveAll(r => ls.Contains(r));
}
vs.Add(nums);
 
int rowIndex = 0;
 
foreach (var row in vs)
{
    Console.WriteLine($"Строка {++rowIndex}:\n{string.Join(" ", row)}");
}
Добавлено через 29 минут
но вопрос времени работы он тоже не покроет, как Вы хотите. на обработку 100.000 значений ушло 36 сек, на 200.000 - уже 2 мин 40 сек. не знаю, зачем Вам вообще такой объем данных рассматривать. но, очевидно, тут нужно уже в сторону многопотока смотреть.
1
 Аватар для Elektrik72
51 / 15 / 7
Регистрация: 09.02.2014
Сообщений: 209
25.04.2022, 17:05  [ТС]
Спасибо большое за помощь! Я пока не буду смотреть код. Попробую еще раз по другому решить, когда сделаю или окончательно отчаюсь), обязательно посмотрю ваш вариант решения!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.04.2022, 17:05
Помогаю со студенческими работами здесь

Найти N первых пар простых чисел, которые отличались бы друг от друга на 2
Не могу понять, почему не делается проверка числа на простоту. #include &quot;StdAfx.h&quot; #include &lt;iostream&gt; #include...

Вывести все пары простых чисел, которые отличаются друг от друга на 2, в заданном промежутке
два простые числа отличаются друг от друга на 2 (пример 41 и 43)вывести все пары таких чисел в промежутке ,где n- натуральное число больше...

Вывод на экране двух слов ГОРИЛЛА , которые по вертикальному горизонтали двигаются друг против друга-один слева напра
вывод на экране двух слов ГОРИЛЛА , которые по вертикальному горизонтали двигаются друг против друга-один слева направо

Определите, каких чисел в массиве больше: которые делятся на первый или которые делятся на последний элемент
Определите, каких чисел в массиве больше: которые делятся на первый элемент массива или которые делятся на последний элемент массива.

Определите, каких чисел в массиве больше: которые делятся на первый элемент массива или которые делятся на последний эле
Определите, каких чисел в массиве больше: которые делятся на первый элемент массива или которые делятся на последний элемент массива


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru