Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 73
1

Составить последовательность наибольшей длины, в которой каждое следующее число делится на предыдущее

22.04.2017, 03:58. Показов 1955. Ответов 16
Метки нет (Все метки)

Доброе время суток! Пожалуйста помогите!
Ввести положительные числа а1,,,аn(n<=100). Составить из них последовательность наибольшей возможной длины, в которой каждая следующее число делится на предыдущее.(3,2,8,4,4,1 это будет 1,2,4,4,8) в Matlab
Как это можно сделать? желательно с кодом и пояснением. Заранее Благодарю!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2017, 03:58
Ответы с готовыми решениями:

Сформировать последовательность, в которой каждое число, записываемое двумя соседними цифрами, делится на 19 или 23
Сформировать последовательность, состоящую не менее чем из n цифр, такую, что каждое двухзначное...

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

Переставить слова в тексте так, чтобы каждое следующее слово начиналось с той буквы, на которую закончилось предыдущее
Дан текст, состоящий из 6 слов по 8 символов, разделенных пробелом. Переставить слова в тексте так,...

Найти предыдущее и следующее число от исходного
Напишите программу, которая считывает целое число и выводит текст, аналогичный приведенному в...

16
93 / 91 / 23
Регистрация: 08.05.2016
Сообщений: 521
22.04.2017, 12:31 2
Начало может быть таким:
Matlab M
1
2
3
4
5
clc, clear all
a=randi(10,1,5)
[x1 y1]=meshgrid(a,a);
b=rem(x1,y1)==0-eye(length(a));
c=[x1(b==1)';y1(b==1)']
Matlab M
1
2
3
4
5
6
7
8
9
a =
 
     4    10     5     2    10
 
 
c =
 
     4    10    10    10    10    10    10
     2     5     2    10    10     5     2
Формируются все возможные пары чисел (без повторений самих себя) с нулевым остатком от деления. Как теперь составить из них последовательность - другой вопрос.
0
Модератор
1228 / 1120 / 338
Регистрация: 13.09.2015
Сообщений: 3,945
22.04.2017, 14:28 3
Цитата Сообщение от Matasin Посмотреть сообщение
Как теперь составить из них последовательность - другой вопрос.
Далее надо смотреть, чтобы число из одной пары делилось на число из другой пары. То есть задача осталась, фактически, прежней. По мне, составление пар - лишний шаг.
0
93 / 91 / 23
Регистрация: 08.05.2016
Сообщений: 521
22.04.2017, 15:24 4
Лучший ответ Сообщение было отмечено KingTao как решение

Решение

Тогда циклы. Отсортировать по возрастанию, поделить на первый член, отсеять всё с не нулевым остатком, повторять пока не закончатся числа в матрице. Затем сделать всё тоже самое, но уже со вторым членом и т. д.. В конце сравнить длины и вывести строку с наибольшей.

Что-то вроде:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
clc, clear all
a=randi(10,1,15); b=sort(a);
k=length(b); l1=1; l=1;
while k~=1
    c=b(rem(b,b(l))==0);
    if length(c)<=1
        break
    end
    b=c(2:end);
    x(l1)=c(1);
    k=length(b); l1=l1+1;
    if k==1
        x(l1)=c(end);
    end
end
disp(a)
disp(x)
Matlab M
1
2
3
     5     8     9     8     4     6     1     2     2     7     5     2     5     2     1
 
     1     1     2     2     2     2     4     8     8
1
Модератор
1228 / 1120 / 338
Регистрация: 13.09.2015
Сообщений: 3,945
22.04.2017, 16:35 5
Цитата Сообщение от Matasin Посмотреть сообщение
Тогда циклы. Отсортировать по возрастанию
То, что надо отсортировать по возрастанию, это безусловно. Можно попробовать дальше через meshgrid. Разделить поэлементно две получившихся матрицы и посмотреть, на какой диагонали больше всего будет целых чисел. Вполне вероятно, что без циклов всё же не обойтись...
1
93 / 91 / 23
Регистрация: 08.05.2016
Сообщений: 521
22.04.2017, 17:02 6
Дальше ТС сам справится.
0
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 73
26.04.2017, 13:28  [ТС] 7
Цитата Сообщение от Matasin Посмотреть сообщение
a=randi(10,1,15);
единственное вот это лучше заменить на вектор (к примеру a=[3 2 8 4 4 1]), поскольку когда он рандомно задается он иногда ошибку выдает, но возможно это только у меня в Matlab.
Спасибо большое за помощь!
0
Модератор
1228 / 1120 / 338
Регистрация: 13.09.2015
Сообщений: 3,945
27.04.2017, 08:43 8
Оказывается, всё проще, если вспомнить, что, если последующее число делится на предыдущее, то последнее число тоже будет делится на каждое из предыдущих.
KingTao, код для вашего примера:
Matlab M
1
2
3
4
5
6
a=[3,2,8,4,4,1]; % задание вектора чисел
b=sort(a); % сортировка чисел по возрастанию
[A,B]=meshgrid(b);
C=mod(B,A)==0; % формирование логического массива для определения позиций чисел, делящихся друг на друга без остатка
s=sum(C,2); % суммирование построчно количества чисел, делящихся друг на друга без остатка
D=b(C(s==max(s)),:) % искомая последовательность
1
Эксперт по математике/физике
3362 / 1888 / 568
Регистрация: 09.04.2015
Сообщений: 5,297
27.04.2017, 10:57 9
В последней строке ошибка, при тестировании 3 остается
Предлагаю вот так
Matlab M
1
D=b(find(b.*C(find((s==max(s))>0),:)>0)) % искомая последовательность
1
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 73
27.04.2017, 13:19  [ТС] 10
Большое спасибо! буду иметь ввиду что можно еще и так без цикла
0
93 / 91 / 23
Регистрация: 08.05.2016
Сообщений: 521
27.04.2017, 14:41 11
Matlab M
1
2
3
4
5
6
7
8
9
10
a =
 
     5     8     9     8     4     6     1     2     2     7     5     2     5     2     1
 
>> D1=b(C(s==max(s)),:) % искомая последовательность
Index exceeds matrix dimensions.
 
>> D2=b(find(b.*C(find((s==max(s))>0),:)>0)) % искомая последовательность
Error using  .* 
Matrix dimensions must agree.
0
Эксперт по математике/физике
3362 / 1888 / 568
Регистрация: 09.04.2015
Сообщений: 5,297
27.04.2017, 16:06 12
Цитата Сообщение от Matasin Посмотреть сообщение
Error using .*
Matrix dimensions must agree.
Ошибка возникает из-за двух вариантов решений, правда в этом примере они одинаковые, но в общем случае могут быть и разные.
Так просто за короткое время я решения не вижу (опыта в таких выражениях маловато), желательно чтобы Centurio посмотрел, он большой или больший специалист в таких выражениях.
0
0 / 0 / 0
Регистрация: 18.04.2017
Сообщений: 73
27.04.2017, 16:44  [ТС] 13
Цитата Сообщение от Matasin Посмотреть сообщение
Error using *.*
Matrix dimensions must agree.
Да это ошибка появляется если вводить больше числе и после он еще уже считает также как в первом варианте
0
93 / 91 / 23
Регистрация: 08.05.2016
Сообщений: 521
27.04.2017, 17:43 14
SSC, решение - выводить все варианты в общем случае.
0
Модератор
1228 / 1120 / 338
Регистрация: 13.09.2015
Сообщений: 3,945
27.04.2017, 19:21 15
Всё же алгоритм неправильный. Похоже, надо через диагонали искать.
0
Эксперт по математике/физике
3362 / 1888 / 568
Регистрация: 09.04.2015
Сообщений: 5,297
28.04.2017, 07:09 16
Цитата Сообщение от Centurio Посмотреть сообщение
Всё же алгоритм неправильный.
Да ывроде все нормально работает, надо только исключить одинаковые варианты ответов и научиться выводить несколько вариантов ответов
0
Модератор
1228 / 1120 / 338
Регистрация: 13.09.2015
Сообщений: 3,945
28.04.2017, 18:42 17
Цитата Сообщение от SSC Посмотреть сообщение
Да ывроде все нормально работает,
Нет. При последовательности 1,2,3,6 выведется вся последовательность, хотя 3 на 2 не делится.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2017, 18:42

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Дана монотонная последовательность, в которой каждое натуральное число k встречается ровно k раз
Дана монотонная последовательность, в которой каждое натуральное число k встречается ровно k раз:...

Составить программу, позволяющую: Найти сумму натуральных двузначных чисел, каждое из которых делится на 3 и не делится на 4
Найти сумму натуральных двузначных чисел, каждое из которых делится на 3 и не делится на 4. ...

Напишите программу, которая находит следующее и предыдущее число для заданного N
Тема следующая. Есть задачка: Напишите программу, которая находит следующее и предыдущее число для...

Вводить последовательность вещественных чисел, пока следующее вводимое число не окажется меньше предыдущего. Вывести полученую последовательность.
Вводить последовательность вещественных чисел, пока следующее вводимое число не окажется меньше...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.