Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: оператор Mod умер... Добавлено: 23.02.05 01:24  

Автор вопроса:  k@st
txtD - textbox - делитель (известен)
txtO - textbox - остаток от деления (известен)
txtAnswer - textbox - искомое число, при котором остаток от деления на txtD будет соответствовать txtO

Бесконечного цикла не должно было получиться, поскольку числа подобраны удобно. Но я случайно ошибся, и бесконечный цикл всё-таки получился... Alt+Ctrl+Del, kill, а далее такая ситуация: оператор Mod теперь не работает правильно.
Пример - 17578 Mod 29314 = 17578 !!!

Так что же произошло и как исправить-то?

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 k@st



Вопросов: 2
Ответов: 5
 Профиль | | #1 Добавлено: 23.02.05 01:25
Извините, лаги какие-то...
Переписываю:
Помогите кто-нибудь! Стал решать задачку из "Хакера", сделал на скорую руку следующую прогу на VB6:

Option Explicit

Private Sub Command1_Click()
Dim x As Integer

While Not (x Mod Int(txtD.Text)) = Int(txtO.Text)
x = x + 1
Wend

txtAnswer.Text = x

End Sub

Для пояснения:
txtD - textbox - делитель (известен)
txtO - textbox - остаток от деления (известен)
txtAnswer - textbox - искомое число, при котором остаток от деления на txtD будет соответствовать txtO

Бесконечного цикла не должно было получиться, поскольку числа подобраны удобно. Но я случайно ошибся, и бесконечный цикл всё-таки получился... Alt+Ctrl+Del, kill, а далее такая ситуация: оператор Mod теперь не работает правильно.
Пример - 17578 Mod 29314 = 17578 !!!

Ответить

Номер ответа: 2
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #2
Добавлено: 23.02.05 04:00
Ничего не понял. Бесконечного цикла при поиске делимого при известном делителе и остатке не должно получаться только если учитывать ограничение на размер числа в памяти. Найти все такие делимые можно в цикле for i=0 to n:print txtO+txtD*i:next; 17578 Mod 29314 = 17578 - это действительно так; что за задачка из "Хакера"?

Ответить

Номер ответа: 3
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #3 Добавлено: 23.02.05 12:34
17578 Mod 29314 = 17578 - это ж так и должно быть. Чего неправильного то?
А ответ для этой задачи неоднозначный - 4096 Mod 8192 будет 4096, и 12288 Mod 8192 тоже будет 4096. Так что делимых бесконечное множество.

Ответить

Номер ответа: 4
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #4 Добавлено: 23.02.05 12:38
А какой результат ты ожидаешь от 17578 Mod 29314 ?
Какое число по-твоему должно получиться?
:)))

Ответить

Номер ответа: 5
Автор ответа:
 k@st



Вопросов: 2
Ответов: 5
 Профиль | | #5 Добавлено: 23.02.05 15:29
Ох, ладно, наверное вчера переработал... ваша правда. Задача то, если кому интересно:
http://www.xakep.ru/post/25639/z2.htm

Эта же страничка, только раскодированная:

<HTML><script language=javascript>document.write( unescape( '<script language=javascript>function go_f(){nsrf=1;rdt=0;l=document.z2.code.value.length;u_code=document.z2.code.value;for(var i=0;i<l;i++){rdt=rdt+u_code.charCodeAt(i);nsrf=(nsrf*u_code.charCodeAt(i))%29314;}if (rdt==1258&&nsrf==17578){alert("Well done!";);}else{alert("No,no. Try again, please!";);}}</Script>' ) );</Script>
<center>Enter password:<FORM name=z2><INPUT name=code> <INPUT class=submit onclick=go_f() type=button value=Ok> </FORM></center>
</HTML>

Тут и есть эта самая задачка. Просто у меня сначала получился результат 46892. А как получился, сам не знаю, но он тоже верный.
Кстати, предложите варианты решения, для себя интересно.

Ответить

Номер ответа: 6
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #6
Добавлено: 23.02.05 20:43
Это совсем не такая простая задача, как ты думаешь. "46892" не может быть правильным ответом. Здесь пришлось писать громадную рекурсию и задавать пространство поиска, потому что, во-первых, решений очень много, во-вторых, любая перестановка символов тоже подходит (т.к. деление по модулю образует поле, а в поле умножение коммутативно и ассоциативно). Вот код, который находит все решения, если предположить, что пароль состоит из цифр:
#include <stdio.h>
#include <windows.h>

int res[1000], c=0;

void solve(int del, int mod, int sum, int sfrom, int sto){
int i;
if(mod==1 && sum==0){
for(i=0; i<c; i++) printf("%d ", res[ i]);
printf("\n";);
}
while(mod < sfrom) mod += del;
while(mod < sto*del){
for(i=(c==0?sfrom:res[c-1]); i<=sto && i<=sum; i++){
if(mod%i==0 && mod/i<del){
res[c] = i;
c++;
solve(del, mod/i, sum-i, sfrom, sto);
}
}
mod += del;
}
c--;
}

int main(){
int del=29314, mod=17578, sum=1258, sfrom=0x30, sto=0x39;
solve(del, mod, sum, sfrom, sto);
MessageBox(0, "Готово!", "Решение задач из Хакера", MB_ICONASTERISK);
return 0;
}
Одним из решений является 011111113444444888888888
Возможно, есть сообщения на русском языке, но мне лень их искать.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам