Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2014.01.05;
Скачать: [xml.tar.bz2];

Вниз

Типа пятничная задачка   Найти похожие ветки 

 
Sha ©   (2013-07-13 13:12) [40]


procedure TForm1.Button1Click(Sender: TObject);
const
 min= 3;
 max= 100;
var
 x, y, z: integer;
 MulPairCount, KnownPairCount, HardSumCount, KnownProdCount: array of integer;
begin;
 SetLength(MulPairCount, 1 + max*max);
 for z:=0 to max*max do MulPairCount[z]:=0;
 for x:=min to max do for y:=x to max do inc(MulPairCount[x*y]);

 SetLength(KnownPairCount, 1 + max+max);
 for z:=0 to max+max do KnownPairCount[z]:=0;
 for x:=min to max do for y:=x to max do if MulPairCount[x*y]=1 then inc(KnownPairCount[x+y]);

 SetLength(HardSumCount, 1 + max*max);
 for z:=0 to max*max do HardSumCount[z]:=0;
 for x:=min to max do for y:=x to max do if KnownPairCount[x+y]=0 then inc(HardSumCount[x*y]);

 SetLength(KnownProdCount,1 + max+max);
 for z:=0 to max+max do KnownProdCount[z]:=0;
 for x:=min to max do for y:=x to max do if HardSumCount[x*y]=1 then inc(KnownProdCount[x+y]);

 Memo1.Lines.Clear;
 for x:=min to max do for y:=x to max do
    if (MulPairCount[x*y]>=2)
   and (KnownPairCount[x+y]=0)
   and (HardSumCount[x*y]=1)
   and (KnownProdCount[x+y]=1)
   then Memo1.Lines.Add(Format("(%d,%d)      %d %d %d %d",
        [x, y,
         MulPairCount[x*y],
         KnownPairCount[x+y],
         HardSumCount[x*y],
         KnownProdCount[x+y]
        ]));

 end;


 
картман ©   (2013-07-13 15:23) [41]


> Sha ©   (13.07.13 13:12) [40]

круто!

А вот это:
Memo1.Lines.Clear;
for x:=min to max do for y:=x to max do
   if (MulPairCount[x*y]>=2)
  and (KnownPairCount[x+y]=0) //- не излишня ли проверка

, учитывая
 for x:=min to max do for y:=x to max do if MulPairCount[x*y]=1 then inc(KnownPairCount[x+y]);

?


 
Sha ©   (2013-07-13 15:31) [42]

> картман ©   (13.07.13 15:23) [41]
> не излишня ли проверка

попробуй ее закомментировать - узнаешь )


 
картман ©   (2013-07-13 15:38) [43]


> попробуй ее закомментировать - узнаешь )

))


 
Компромисс1 ©   (2013-07-13 17:09) [44]


> (13,16)


Если это верный ответ, то у меня претензия к топик-стартеру: надо сразу было писать, чтобы не пытались решить без компьютерной программы.


 
Sha ©   (2013-07-13 18:01) [45]

почти все задачи на перебор не для человека


 
Очень злой   (2013-07-14 08:53) [46]


> Sha ©   (13.07.13 12:51) [39]
>
> (13,16)


Да.


> Компромисс1 ©   (13.07.13 17:09) [44]
>
>
> > (13,16)
>
>
> Если это верный ответ, то у меня претензия к топик-стартеру:
>  надо сразу было писать, чтобы не пытались решить без компьютерной
> программы.


Ну так я же написал задачку на форуме программистов. )

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


 
Юрий Зотов ©   (2013-07-14 23:39) [47]

> султан сообщил первому визирю произведение этих чисел,
> а второму - их сумму.
> Первый визирь подумал и говорит:

Какое число назвал тебе султан?

Получив ответ, первый визирь решает систему двух уравнений с двумя неизвестными:
x+y=s
x*y=m

и называет оба числа.


 
Юрий Зотов ©   (2013-07-15 00:48) [48]

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


 
Компромисс1 ©   (2013-07-15 10:35) [49]

- Я загадал два числа A и B от 3 до 100. Вы должны их мне назвать.
При этом султан сообщил первому визирю произведение этих чисел P, а второму - их сумму S.Первый визирь подумал и говорит:
- Я не знаю что это за числа


1) P является произведением более чем двух пар чисел от 3 до 100 (далее не пишу от 3 до 100)

На что второй ответил:
- Я был в этом уверен.


2) S является суммой более чем двух пар чисел, произведение каждой пары является произведением более чем двух пар чисел от 3 до 100


> Тогда первый говорит:
> - В таком случае, я знаю, что это за числа.


3) Только одна пара чисел из 1) обладает свойством 2)

Второй:
- Тогда и я знаю, что это за числа.


4) Только одна пара чисел из 2) обладает своством 3)


 
Компромисс1 ©   (2013-07-15 10:36) [50]

Вместо "более чем двух пар" везде должно стоять "более чем одной пары"


 
Sha ©   (2013-07-15 10:39) [51]

Судя по всему, тут кое-кого не устраивает формулировка задачи)
Позволю себе немного ее подредактировать.

У одного султана было 2 мудреца и кандидат на место третьего - ты.
Захотел он проверить твою сообразительность.

Позвал к себе мудрецов и кандидата и сказал всем троим:
- Я загадал два числа от 3 до 100. Первому мудрецу я прошепчу на ухо
произведение этих чисел, второму - сумму.

Сделал он так, потом спрашивает второго мудреца:
- Как ты думаешь, если бы мой первый вопрос был бы задан первому
мудрецу, смог ли он назвать мне задуманные числа?
- Нет.

Тогда султан спрашивает первого мудреца:
- Можешь ли ты назвать эти числа?
- Да.

Затем султан спрашивает второго:
- Можешь ли ты назвать эти числа?
- Да.

Затем султан обращается к тебе:
- Назови мне зти числа или я прикажу отрубить тебе голову!


 
Очень Злой   (2013-07-15 10:45) [52]


> Sha ©   (13.07.13 13:12) [40]


Я так делал:
var
 min,max:integer;  

...

// Реплика 1. Первый визирь не знает числа.
// Следовательно произведение имеет более одного варианта разложения
// на множители удовлетворяющие условию задачи
//
// функция возвращает true - если произведение имеет один вариант разложения

function IsP1(num:integer):boolean;
var
 i:integer;
 count:integer;
begin
 count:=0;
 for i:=min to trunc(sqrt(num)) do if (num mod i = 0) and (num div i <= max) then inc(count);
 result:=count=1;
end;

// реплика 2. Второй визирь уверен в том что первый не знал числа.
// Следовательно названная ему сумма ни каким образом не может быть разложена
// на слагаемые, удовлетворяющие условию задачи,
// на произведение которых ранее описанная функция IsP1() выдала бы true.
//
// Для такой суммы возвращается true

function IsS1(num:integer):boolean;
var
i:integer;
begin
result:=true;
for i:=min to num div 2 do if (num-i<=max) and isp1(i*(num-i)) then
  begin
    result:=false;
    break;
  end;
end;

// реплика 3. Первый визирь говорит что он знает числа.
// Следовательно произведение чисел среди всех своих вариантов разложения
// имеет один и только один вариант разложения на множители удовлетворяющие условию задачи
// для суммы которых ранее описанная функция IsS1() даст true
//
// для таких произведений возвращаем true

function IsP2(num:integer):boolean;
var
i:integer;
count:integer;
begin
count:=0;
if not IsP1(num) then for i:=min to trunc(sqrt(num)) do
  if (num mod i = 0) and (num div i <= max) and IsS1(i+(num div i)) then inc(count);
result:=count=1;
end;

// Реплика 4. Второй визирь сказал что тоже знает числа.
// Следовательно сумма имеет один и только один вариант разложения на слагаемые удовлетворяющие условию задачи
// для произведения которых ранее описанная функция IsP2 дает true
//
// для таких сумм возвращаем строку с обоими числами, иначе пустую строку
function IsS2(num:integer):string;
var
i,count:integer;
begin
count:=0;
if IsS1(num) then for i:=min to num div 2 do
  if (num-i<=max) and isp2(i*(num-i)) then
     begin
       inc(count);
       result:=inttostr(i)+"  "+inttostr(num-i);
     end;
if count<>1 then result:="";
end;

// ну и наконец-то сам перебор сумм и вывод результата
procedure TForm1.Button1Click(Sender: TObject);
var
k:integer;
p:string;
begin
min:=SpinEdit1.Value; // минимальное значение чисел
max:=SpinEdit2.Value; // максимальное значение чисел
// перебираем все возможные суммы двух чисел
for k:=min+min to max+max do
begin
  p:=iss2(k);
  if length(p)>0 then Memo1.Lines.Add(p);
end;
end;



 
Sha ©   (2013-07-15 11:00) [53]

> Очень Злой   (15.07.13 10:45) [52]
> Я так делал:


Считает долго, наверное?

Я с самого начала нацелился на массивы, т.к. предполагал,
что будет сильная зависимость решения от диапазона разрешенных чисел.

Результат оказался даже интереснее, чем я мог ожидать.
С увеличением верхней границы новые решения не только появляются,
но и исчезают...


 
Очень Злой   (2013-07-15 11:09) [54]


> Считает долго, наверное?


Совсем нет. по крайней мере визуально не заметно задержки...

Пробовал GetTickCount, но разница между его значением после расчетов и до расчетов обычно равна 0


 
Sha ©   (2013-07-15 11:13) [55]

Я свою гонял с небольшим шагом до переполнения памяти (max=12000),
увидел много интересного.

С вложенными вызовами такое вряд ли удалось бы в преемлемое время)


 
Очень Злой   (2013-07-15 11:17) [56]


> Sha ©   (15.07.13 11:13) [55]
>
> Я свою гонял с небольшим шагом до переполнения памяти (max=12000),
>
> увидел много интересного.


Ну у меня если max увеличивать - то да, время вычислений начинает быть заметным. 12000 не пробовал... наверное действительно будет долго...


 
Визирь 3   (2013-07-17 10:01) [57]

> - Я загадал два числа от 3 до 100. Вы должны их мне назвать.


А султан загадывает разные числа или может загадать и два одинаковых? Например 22 и 22.


 
Sha ©   (2013-07-17 10:35) [58]

Ты должен исходить из того, что он может загадать любые в указанном интервале.

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

В задаче тебе предлагается найти все возможные пары чисел,
которые может выбрать султан.


 
Дмитрий СС   (2013-07-17 10:38) [59]

Как вы формализовали две последних реплики?


 
Sha ©   (2013-07-17 10:39) [60]

И, мне кажется, лучше использовать условия задачи из [51].
В такой формулировке они понимаются однозначно.


 
Sha ©   (2013-07-17 10:44) [61]

> Дмитрий СС   (17.07.13 10:38) [59]
> Как вы формализовали две последних реплики?


Выбирай, что больше нравится:

Sha ©   (13.07.13 13:12) [40]
Компромисс1 ©   (15.07.13 10:35) [49, 50]
Очень Злой   (15.07.13 10:45) [52]

В любом из этих постов смотри 2 последних куска текста)


 
Визирь 3   (2013-07-17 10:51) [62]

> Sha ©   (17.07.13 10:35) [58]
> Ты должен исходить из того, что он может загадать любые
> в указанном интервале.

Любые разные или любые и одинаковые тоже?

Это существенно. Так как в одном случае таких пар нет, а в другом есть одна, которая и озвучена.


 
Sha ©   (2013-07-17 10:57) [63]

Первое число - любое из диапазона 3..100.
Второе число - любое из диапазона 3..100.
Естественно, они могут совпасть)


 
Визирь 3   (2013-07-17 11:03) [64]

ну, это не очевидно из фразы:

> Я загадал два числа от 3 до 100.


потому и уточнил. Дело в том. что я первоначально решал исходя из предположения, что одинаковые нельзя и получал, что решения нет. У вас же заметил, что вы используете и диагональ. Изменил и получил ответ. Проанализировав нашел и причину.


 
Дмитрий СС   (2013-07-17 11:09) [65]


> Sha ©   (17.07.13 10:44) [61]

В твоем варианте получается что оба числа простые и подобрать не так сложно.

Но в исходной задаче, если оба числа простые - то первый визирь сразу бы сказал что он может их назвать.

Поэтому такая переформулировка не эквивалентна исходной задаче.


 
Sha ©   (2013-07-17 11:10) [66]

Понимаю.

Решая задачу, я предположил, что если бы одинаковые было нельзя,
фраза звучала как-то так: "Я загадал два различных числа от 3 до 100".


 
Sha ©   (2013-07-17 11:11) [67]

> Дмитрий СС   (17.07.13 11:09) [65]
> В твоем варианте получается что оба числа простые...

Поясни, как это получается?


 
Дмитрий СС   (2013-07-17 11:24) [68]

Первый визирь (произведение = 24) подумал и говорит:
- Я не знаю что это за числа (т.е. это может быть 3*8 и 6*4)

На что второй (имея сумму = 11) ответил:
- Я был в этом уверен (т.к. все комбинации 3*8, 4*7, 5*6 не раскладываются однозначно на множители от 3 до 100).
Если бы второй услышал сумму=10, но не был бы уверен (т.к. произведение мого бы быть 3*7 (два простых числа)).

Тогда первый говорит (поняв, что если второй уверен, то сумма равна 11):
- В таком случае, я знаю, что это за числа (3 и 8).

Второй:
- Тогда и я знаю, что это за числа (тут мне уже лень рассуждать, но думаю не сложно исключить 4и7 и 5и6).


 
Визирь 3   (2013-07-17 11:26) [69]

4*7 - однозначно в нашем диапазоне


 
Дмитрий СС   (2013-07-17 11:28) [70]

4и7 и 5и6 исключаются потому, что первый бы сразу назвать эти числа. Вот.


 
Визирь 3   (2013-07-17 11:28) [71]

У второго визиря в случае возможности одинаковы пар может быть

[13, 19, 25, 29, 31, 37, 43, 49, 53, 55]

в случае только различных

[13, 19, 25, 29, 31, 37, 43, 49, 53]

11 тут нет.


 
Визирь 3   (2013-07-17 11:30) [72]


> 5и6

нет

5*6 = 10 * 3


 
Дмитрий СС   (2013-07-17 11:31) [73]

если бы были числа 4 и 7 . первый визирь имея произведение = 28 = 2 * 2 * 7 сразу бы ответил что знает эти числа, т.к. разложения 2 и 14 не может быть по условию задачи.


 
Дмитрий СС   (2013-07-17 11:33) [74]

с 4 и 7 определились, сейчас с 5 и 6 попробую


 
Визирь 3   (2013-07-17 11:35) [75]


> Дмитрий СС   (17.07.13 11:31) [73]

Все это более чем замечательно. Но никак не проливает свет на [61].


 
Визирь 3   (2013-07-17 11:35) [76]

на 65, конечно.


 
Sha ©   (2013-07-17 11:39) [77]

> Дмитрий СС   (17.07.13 11:24) [68]
> т.к. все комбинации 3*8, 4*7, 5*6 не раскладываются однозначно на множители от 3 до 100).

А как еще можно разложить 28=4*7=?*?

> Если бы второй услышал сумму=10, но не был бы уверен (т.к. произведение мого бы быть 3*7 (два простых числа)).

Не понял.


 
Дмитрий СС   (2013-07-17 12:01) [78]


> Sha ©   (17.07.13 11:39) [77]

Никак, я ошибся.


 
Дмитрий СС   (2013-07-17 12:20) [79]


> > Если бы второй услышал сумму=10, но не был бы уверен (т.
> к. произведение мого бы быть 3*7 (два простых числа)).
>
> Не понял.

Если сумма может быть разложена на сумму двух простых чисел, то второй визирь уже не может быть уверен в том что первый не знает чисел.


 
Sha ©   (2013-07-17 13:46) [80]

> Дмитрий СС   (17.07.13 12:20) [79]
> Если сумма может быть разложена на сумму двух простых чисел,
> то второй визирь уже не может быть уверен в том что первый не знает чисел.


Ну, это очевидно.
В этой задаче проще не пользоваться простотой чисел )

Гораздо выгоднее подсчитывать количество всевозможных произведений
чисел из заданного диапазона.

Это также позволит легко поиграть с границами при желании.



Страницы: 1 2 3 вся ветка

Форум: "Прочее";
Текущий архив: 2014.01.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.63 MB
Время: 0.004 c
15-1374177026
Jeer
2013-07-18 23:50
2014.01.05
Помним, чтим.."Нормандия-Неман"


15-1374264388
Smile
2013-07-20 00:06
2014.01.05
С днем рождения!


15-1374042598
Юрий
2013-07-17 10:29
2014.01.05
С днем рождения ! 16 июля 2013 вторник


15-1374222419
Vasa777
2013-07-19 12:26
2014.01.05
крипто


15-1374420692
ClawClaw
2013-07-21 19:31
2014.01.05
Чей шахматный стиль вам больше всего по душе?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский