Всем привет! Значит проблема вот в чём, не могу создать обратный алгоритм (туплю наверно), есть программа которая проверяет регистрацию следующим образом: серийник из 9-ти цифр (и только цифр), первые из которых четыре известных, остальные пять неизвестны, этот составной серийник должен делится нацело на 11 (т.е. остаток должен быть нуль). Вроде всё просто, а выход никак не могу найти. Помогите плиз.
Avoidik Если проблема в создании числа делящегося на 11, то смотри http://www.wasm.ru/forum/index.php?action=vthread&forum=7&topic=8666&page=2 Если нет, то обьясни подробнее.
Stiver, да вообщем-то проблема в этом, но есть и другая: серийник вида: 1234xxxxx, где xxxxx - любое число, до деления и после деления на 11, перед серийником должна присутствовать последовательность 1234
Пойдем с конца : 1) дано (1)(2)(3)(4)(x)(y)(z)(t) * 11 = (1)(2)(3)(4)(?)(?)(?)(?)(?) 2) перемножаем левую часть : (1)(2)(3)(4)(x)(y)(z)(t) * 11 = (1)(3)(5)(6)(4+x)(x+y)(y+z)(z+t)(t) (без учета переносов) 3) максимально возможный перенос - (1)(3)(5)(8)(?)(?)(?)(?)(?) Наводит на мысли ?
9999999*11=109999989<123400000 если умножить максимальное семизначное число будет меньше, чем надо 12340000*11=12340000*10+12340000=135740000>123400000 если умножить минимальное восьмизначное число, подходящее под описание (лидирующие 1234*) будет больше, чем надо вывод: нет решения
OLS Zerro Crash 1234 дано скорее всего в качестве примера, реальные числа другие, хотя: Avoidik Ты уверен, что сохраняться должны первые 4 цифры? При умножении на 11 в принципе можно сохранить только одну первую цифру.
OLS, не наводит :\ Zerro Crash & Stiver, число 1234 дано ошибочно, на самом деле я выяснил, что первые четыре цифры должны быть 5127, 5128 или 5129 (и именно первые 4-е), если судить по проверке Zerro Crash, то в таком случае решение есть
9999999*11=109999989<512700000 если умножить максимальное семизначное число будет меньше, чем надо 51270000*11=563970000>512900000 если умножить минимальное восьмизначное число, подходящее под описание (лидирующие 512?*) будет больше, чем надо вывод: нет решения гы
Avoidik вот и я о чем.. может там не 11? или алгоритм другой? так как ты сказал - сам видишь, логика неопровержима
алгоритм проверки упрощённый донельзя: есть текстовый буфер с серийником 512900000, далее этот текстовый серийник конвертируется во float (st0), потом st0 запихивается в dword, далее dword делится на 11, если остаток ноль, то программа зарегистрирована, если не ноль, то нет
Avoidik серийник конвертируется во float (st0), потом st0 запихивается в dword _______________ а поподробнее про эту махинацию? что значит "конвертируется"? Код (Text): data db "512900000",0 start: fbld offset data fstp eax div 11 test edx,edx jz ok jmp invalid_serial так?