Страница: 1 |
Страница: 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-сайт:
Профиль | | #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-сайт:
Профиль | | #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
Возможно, есть сообщения на русском языке, но мне лень их искать.