Задача: Интересное число

Для заданного числа    N  найти наименьшее положительное число с суммой цифр равной  N, которое делится на  N.

Входные данные

Входные данные состоят из нескольких тестов. Для каждого теста в одной строке  записано одно число  N (1< N<109). Тесты заканчиваются строкой с единственным числом  0.

Выходные данные

В каждой строке выходных данных содержится единственное искомое число. Выходные данные заканчиваются строкой с числом 0.

Вот и решение:

#include "stdafx.h"
#include
using namespace std;

#define SIZE 1000000000
#define SIZE1 1000000000000000


int _tmain(int argc, _TCHAR* argv[])
{
    unsigned long long N,i,b[20],summa,a[20];
    bool sss=false;
    int j,k;
    while (1) 
   {
       cout<<"Vvedite chislo: ";
       cin>>N;

       if (N==0) 
         exit(1);
       else
          if (N>1 && N
          {
                   
               for (i=N; i<=SIZE1 ;i++) 
              {
                          
                   if (i%N==0) 
                  {
                      summa=0;
                      b[0]=i;
                      for (j=0; j<=15. ; j++) 
                      {
                           a[j]=b[j] % 10;
                           b[j+1]=b[j] / 10;
                           if (b[j+1]==0) 
                           {
                               for (k=0; k<=j ;k++) 
                                               {
                                                      summa=summa+a[k];
                                               }
                                               if (summa==N) 
                                                      sss=true;
                                               else
                                                      sss=false;
                                        break;
                                        }
                                  }
                           }

                           if (sss)
                           {     
                                  cout<'\n';
                                  break;
                           }
                    }
            
             }
             else
                    cout<<"\nVvedite chislo bolshe 1 i menshe 1000000000.\nEsli vvedete 0 proqramma zavershitsa!\n\n";
       }
       return 0;
}




Форматирование ввода/вывода в С++

В С++ информацию можно вводить и выводить в широком диапазоне форм. Можно изменять определённые параметры ввода и вывода  информации. Каждый поток (cin и cout) имеет набор флагов формата (format flags), которые предназначены для управления форматированием информации и представляют собой битовые маски(bitmasks), т.е каждый флаг занимает один бит. Стандартная библиотека  ввода/вывода С++ (Standard C++) создаёт два класса шаблона: одна для 8-ми битных символов, а другая для 16-ти битных символов. К 16-ти разрядным относятся символы уникода, каждый из которых хранится в 2-х байтах. Здесь речь пойдёт о 8-ми разрядных потоках, так как они используются чаще всего. К ним относятся потоки: cout, cin, cerr, clog. Да, в отличии от языка С (stdout, stdin, stderr) в С++ открываются целых четыре потока. Битовые маски объявлены в классе ios (производный от класса basic_ios) как данные типа fmtflags (аналогичен типу long). Вот список флагов: 

  • ·         adjustfield (ставит флаги left, right и internal)
  • ·         basefield (ставит флаги oct,dec и hex)
  • ·         boolalpha (данные типа bool выводятся в виде “true” и “false”)
  • ·         dec (вывод в десятичной системе счисления, установлен по умолчанию)
  • ·         fixed (вещественные числа выводятся в обычной форме)
  • ·         floatfield (ставит флаги scientific и fixed)
  • ·         hex (вывод в шестнадцатеричной системе счисления)
  • ·         internal (для заполнения поля вставляется пробел между цифрами)
  • ·         left (выравнивание по левому краю)
  • ·         oct (вывод в восьмеричной системе счисления)
  • ·         right (выравнивание по правому краю)
  • ·         scientific (вывод вещественных чисел с использованием “E”)
  • ·         showbase (показывает основание типа системы счисления)
  • ·         showpoint (показывает десятичную точку и последующие нули для вещественных чисел)
  • ·         showpos (показывает знак “+” перед положительными числами)
  • ·         skipws (отбрасываются невидимые символы(пробел, перенос строки, табуляция))
  • ·         unitbuf (освобождает буфер)
  • ·         uppercase  (переводит регистр в верхний уровень)  
  
Внутри класса ios имеются три функции для работы с вышеперечисленными флагами: setf(), unsetf(), flag().  Теперь по порядку об использовании этих функций.
Функция setf() устанавливает флаг, который передаётся в функцию как параметр. Объявлена эта функция следующим следующим образом:
fmtflags setf (fmtflags flag);
Здесь вместо “flag” нужно подставить флаг который надо установить. НО! Флаги являются членами класса ios и просто к ним не обратиться. Поэтому надо использовать оператор глобального разрешения
“::”. Например: ios::showbase. Возвращает функция старое значение переданного в параметре флага. Важно понять, что установив тот или иной флаг он будет распространяться на каждый поток создаваемый этим классом, то есть на потоки cout и cin.  Пример использования:
cout.setf (ios::hex);
Функция unsetf() предназначена для снятия флажка. Объявлена так:
void unsetf (fmtflags flag);
Как видно функция ничего не возвращает. Пример использования:
 
cout.unsetf(ios::dec);
 При использовании функций setf и unsetf в качестве параметра можно передавать несколько флагов. Для этого достаточно разделять их оператором побитового ИЛИ. Например:
cout.setf (ios::showpos | ios::showpoint | ios::hex);
cout.unsetf (ios::showpos | ios::showpoint | ios::hex);
Приведу пример с использованием обеих функций.

 #include "stdafx.h"
 #include "iostream"
 #include
 using namespace std;
  
 void main ()
 {
       cout<<-10<<' '<<10<<' '<<123.4<<"\n\n";
       cout.setf (ios::showpoint | ios::showpos | ios::scientific);
       cout<<-10<<' '<<10<<' '<<123.4<<"\n\n";
       cout.unsetf(ios::showpoint | ios::showpos | ios::scientific);
       cout<<-10<<' '<<10<<' '<<123.4<<"\n\n";
       _getch();
 }

И наконец последняя функция flags(). Объявлена она следующим образом:
fmtflags flags (fmtflags flags);
Эту функцию можно использовать двояко. Первый способ это получение информации о всех полях. Пример:
ios::fmtflags OldFlags;
OldFlags=cout.flags ();
Второй способ заключается в том, что с помощью этой функции можно установить все флажки формата. Для этого функции нужно передать переменную с информацией о всех полях. При этом предыдущие поля перезаписываются на новые. Пример:
cout.flags(OldFlags);
В качестве примера простая программа:

 #include "stdafx.h"
 #include
 #include
 using namespace std;
 void main()
 {
        cout<<-10<<' '<<10<<' '<<123.4<<"\n\n";
        ios::fmtflags OldFlags;
        OldFlags=cout.flags();
        cout.setf (ios::showpoint | ios::showpos | ios::scientific);
        cout<<-10<<' '<<10<<' '<<123.4<<"\n\n";

        cout.flags(OldFlags);
        cout<<-10<<' '<<10<<' '<<123.4<<"\n\n";
        _getch();
 } 

Если будете практиковаться с флажками формата, то очень кстати придётся вот эта функция:

 void showflags()
 {
     ios::fmtflags flags;
     flags=cout.flags();
     if (flags & ios::skipws) cout<< "skipws enable\n";
     else cout<< "skipws disable\n";
     if(flags & ios::left) cout << "left enable\n";
     else cout << "left disable\n";

     if(flags & ios::right) cout << "right enable\n";
     else cout << "right disable\n";

     if(flags & ios::internal) cout << "internal enable\n";
     else cout << "internal disable\n";
     if(flags & ios::dec) cout << "dec enable\n";
     else cout << "dec disable\n";
     if(flags & ios::oct) cout << "oct enable\n";
     else cout << "oct disable\n";
     if(flags & ios::hex) cout << "hex enable\n";
     else cout << "hex disable\n";
     if(flags & ios::showbase) cout << "showbase enable\n";
     else cout << "showbase disable\n";

     if(flags & ios::showpoint) cout << "showpoint enable\n";
     else cout << "showpoint disable\n";

     if(flags & ios::showpos) cout << "showpos enable\n";
     else cout << "showpos disable\n";

     if(flags & ios::uppercase) cout << "uppercase enable\n";
     else cout << "uppercase disable\n";

     if(flags & ios::scientific) cout << "scientific enable\n";
     else cout << "scientific disable\n";

     if(flags & ios::fixed) cout << "fixed enable\n";
     else cout << "fixed disable\n";

     if(flags & ios::unitbuf) cout << "unitbuf enable\n";
     else cout << "unitbuf disable\n";

     if(flags & ios::boolalpha) cout << "boolalpha enable\n";
     else cout << "boolalpha disable\n";

    cout << "\n";
}

Она выводит информацию о полях. 

Notepad++ на Азербайджанском

Месяц назад скачал Notepad++ для семёрки с официального сайта. Так вот решил собственноручно перевести его на родной азербайджанский. Перевод занял почти месяц, так как меню в программе не бедствует. Скачать патч можно отсюда 


А вот и скрин:

Хэндл окна консольной программы

При написании кода консольной программы иногда бывает, что приходится работать с функциями, в которорых один из параметров это хендл текущего приложения. А может и вообще в собственных функциях понадобится. Понятно что для консольного приложения его просто не получить. Это в оконных программах он получается автоматом. Например:

 int WINAPI WinMain (
 HINSTANCE hInstance,
 HINSTANCE hPrevInstance, 
 PSTR lpCmdLine, 
 int nCmdShow)

Задесь hInstance это хендл оконного приложения. А как же получить хендл консольной программы?

Вот простая функция:

 HANDLE GetConsoleHANDLE  ( ) {
 HANDLE handleConsoleWindow; 
 SetConsoleTitle (NAME_CONSOLE_APPLICATION);
 handleConsoleWindow = FindWindow (NULL, NAME_CONSOLE_APPLICATION);
 if ( handleConsoleWindow==0 )
 printf ("Error Find Window");
 return handleConsoleWindow;
 }

Итак функция имеет тип HANDLE потому, что  возвращает переменную именно такого типа. Функция начинается с того что обьявляется переменная handleConsoleWindow типа HANDLE и именно её впоследствии  после обработки будет возвращать функция. Затем вызываем функцию SetConsoleTitle, которой в качестве параметра передаём заголовок окна консоли. Т.е эта функция устанавливает заголовок NAME_CONSOLE_APPLICATION консольному окну, где запущенна программа. Затем вызывается функция FindWindow, которая ищет окно с заголовком NAME_CONSOLE_APPLICATION, для этого он передаётся в качестве параметра функции. Если функция находит окно, т.е окно вашей программы, она возвращает хендл программы (окна). Если не находит, то возвращает ноль. И в конце возвращаем переменную handleConsoleWindow. Да, кстати незабудьте определить макрос NAME_CONSOLE_APPLICATION.
Например:


 #define NAME_CONSOLE_APPLICATION      "This is my program!"

Как обновить eset nod32 без интернета


С этим столкнулся когда устанавливал антивирус на компьютерах не имеющих подключения к интернету или имеющих, но технологией dial-up. Понятно что на dial-up далеко не уедешь и обновление будет занимать много времени. Ну вот собственно как раз на такой случай жизни есть простое и безотказное решение, которое я опишу снизу. Кстати способ этот действует как для ESET NOD32 (антивирус), так и для ESET NOD32 Smart Security (антивирус+файервол), для 3-й и 4-й версий.

Первым делом нужно достать сигнатурную базу ESET NOD32. Как бы это громо не звучало, делаеся это очень просто. Достаточно скачать архив вот с этой страницы. Внимание!!! Предварительно нужно временно отключить интернет защиту или полную защиту NOD-а, так как он блокирует сайт, считая его опастным для пользователей. На самом деле сайт не опастный, просто предоставлет базу NOD-а бесплатно. Вот как отключить защиту:


  
Или вот так:


База небольшая, весит всего около 30 мегабайт. Итак после того как архив скачали, распакуем его в папку, например:
C:\NOD32_3_4_UPD
 Затем нужно указать NOD-у  откуда надо обновляться. Для этого сделайте следущее:
Нужно включить расширенную настройку.


Затем надо перейти в настройки.



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


Путь к папке, куда распаковали базу, в качестве примера у нас
 C:\NOD32_3_4_UPD
Вписываем это значение в поле  "Серверы обновлений" и нажимаем на кнопку "Добавить", затем нажимаем на кнопку "ОК", потом ещё раз "OK".


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

Взлом adsl модема и подключение к интернету на высокой скорости бесплатно

Собственно говоря атака которую я тут опишу использует две уязвимости. Не будем разбирать никаких эксплойтов, всё  что нужно так это ADSL подключение в АТС, провайдер, сканер ip и прямые руки. Сканер можно достать здесь. Советую использовать LanSpy, впрочем LanScope тож сойдёт. Они бесплатные и имеют понятный GUI. Собственно начнём…

Мы будем атаковать ADSL модемы, а для этого нужно знать в каком диапазоне IP они находятся. Т.е нужно узнать диапазон IP адресов провайдера. Для этого полно сайтов-сервисов предоставляющие услугу wois, которая даёт информацию об провайдере, диапазоне его ip адресов, местонахождении на карте, твоей ОС, активного на данный момент браузера…
 Элементарно можно вписать в google запрос “узнать ip” и он скинет тебе кучу ссылок. Теперь после того как узнали диапазон ip, нужно просканировать сеть в этом диапазоне, сканер желательно настроить так, чтобы он сканировал только порты (а конкретней 80-й и 23-й), это полезно как для твоего трафика, так и для времени. Итак в полученном списке IP ищем тех, у которых открыт помимо 80-го порта (http) и 23-й, это telnet. Он предназначен для консольного управления модемом (впрочем это отдельная тема).
После того как нашли таковой, вбиваем IP в адресную строку браузера, желательно Opera и делаем запрос. В ответ браузер просит ввести логин и пароль от модема. Вот тут и первая уязвимость. Суть в том что все модемы в зависимости от модели имеют по умолчанию определённый логин и пароль. Список логин паролей от разных моделей можно посмотреть тут. Обычно это слово “admin”. А инсталяторы устанавливающие ADSL подключение не меняют их! Итак после того как вы успешно ввели данные, браузер выплюнет (это если опера, а если эксплорер (ослик), то вырвет) в ответ программный интерфейс управления модемом. В зависимости от модема они различаются. Теперь осталось узнать логин и пароль от ADSL подключения. Он хранится в настройкак соединения. Для того чтобы его добыть переходим по ссылке “Advanced setup”. И тут должна появиться страница с настройками. Есди не появилась, кликаем на кнопку adsl или edit, впрочим зная модель можно быстро найти мануал и разобраться где находятся данные аккаунта. Итак находим поле с логин и пассвордом. Видим что логин показан в открытом виде, а пассворд скрыт звёздочками. И тут используем вторую оплошность, уже разработчиков веб интерфейса модема. Дело в том, что визуально он скрыт звёздочками, но вовсе не шифруется. Т.е если заглянуть в HTML страницы, то можно увидеть пассворд в открытом виде. А найти в коде его можно вбив в поиск уже известный логин, а пароль где-то рядом будет. Он находится обычно в секции Password, в виде значения переменной value.

.  

Очень часто вместо логин и паролей указываеют номер телефона. Итак когда данные получены можно считать, что модем взломан. Далее заходим на сайт прова и логинимся используя полученные данные. Зачем? Тут можно изменить пароль, но если сделать это, то будьте уверенны, что Вам скоро позвонят на телефон или ещё хуже в дверь. Тутже можно просмотреть тариф и весь трафик, т.е когда обычно пользователь заходит в сеть.  Это я к тому что одновременно под одним и тем же аккаунтом не могут быть два пользователя и если ты вошёл в сеть используя его акаунт, а он в это время пытается коннектится к сети, то его будет ждать облом. И тогда он звонит провайдеру, где вычислить тебя как дважды два!
Чтобы заплатать такую дыру достаточно сменить пассворд модема и аккаунта с дефолтного на более сложный.
Внимание!!! Информация предоставлена только в ознакомительных целях и целях защиты пользователей. Автор не несёт ответственность за последствия.

Аль Капоне

На визитной карточке американского гангстера Аль Капоне было написано «торговец мебелью», хотя он занимался контрабандой, сутенёрством и игорным бизнесом. Несмотря на то, что все знали его как мафиози, спецслужбы не смогли раздобыть доказательства этому и смогли арестовать Аль Капоне только по обвинению в уклонению от выплаты налогов.