Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2013, 17:50   #11
Logannn
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 16
По умолчанию

Спасибо за развернутый ответ, интересует тот способ с которым я смогу потом эти числа задавать в ручную. буду пробовать.
Logannn вне форума Ответить с цитированием
Старый 15.01.2013, 00:11   #12
Logannn
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 16
По умолчанию

В первом способе как избежать переполнения?

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

А второй способ мне как новичку пока что сложно понять.
Logannn вне форума Ответить с цитированием
Старый 15.01.2013, 01:14   #13
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
В первом способе как избежать переполнения?
Так же, как и во втором. Посмотрите внимательно:
Код:
int acc = 1;
for(int i=0; i<degree; ++i){
  acc = (acc*x) % M; //Промежуточные результаты всегда меньше M^2
}
return acc;
Цитата:
В третьем способе, произвольно задавать числа с клавиатуры не получится.
Ну... да. Вы задали вопрос про конкретные числа, я и ответил. В общем случае, если НОД(a,N)=1, то a^(ф(N))%N=1, где ф(n) - функция Эйлера. Так что если степень много больше числа, по модулю которого проводятся вычисления, можно потратить время на факторизацию.

Цитата:
А второй способ мне как новичку пока что сложно понять.
Советую всё же сосредоточиться. Ещё раз, с комментариями:
Код:
//Функция поиска степени по модулю
int FindDegreeByModulo(int x, int degree, int M){
  //Переменная-"аккумулятор": в ней "накапливается" результат
  int acc=1;
  //Внимание! Пусть требуемый ответ - R.
  //Тогда сейчас R = x^degree % M = acc*(x^degree) % M (просто умножаем на 1)
  
  //Пока "оставшаяся" степень - не ноль,
  while(degree != 0){
    //Если степень нечётная,
    if(degree%2 == 1){
      //Домножаем аккумулятор на x по модулю M
      acc = (acc*x) % M;
    }
    //Возводим x в квадрат по модулю M и делим степень на 2
    x = (x*x) % M;
    degree >>= 1;

    //Если в начале итерации цикла соблюдалось, что R = acc*(x^degree) % M, то:
    //1) При degree=2k, на конец итерации acc'=acc, x'=(x*x)%M, degree'=k и 
    //    (x'^degree')%M = ((x^2)^k)%M = (x^2k)%M.
    //    Таким образом, acc'*(x'^degree') % M по-прежнему равно R
    //2) При degree=2k+1, acc'=(acc*x)%M, x'=(x*x)%M, degree'=k и
    //    acc'*(x'^degree')%M = acc*x*((x^2)^k)%M = acc*(x^(2k+1))%M.
    //    То есть, и в этом случае acc'*(x'^degree') % M = R
    //  Такое соотношение, сохраняющееся от итерации к итерации, называется инвариантом цикла
  }
  //"Оставшаяся" степень ноль, x^degree "переехало" в переменную acc
  //Действительно, ведь по-прежнему ответ R = acc*(x^degree)%M = acc*(x^0)%M = acc%M
  //Поскольку acc всегда меньше M (проверьте это сами), то в этот момент R = acc.
  return acc;
}

Последний раз редактировалось Abstraction; 15.01.2013 в 01:34.
Abstraction вне форума Ответить с цитированием
Старый 16.01.2013, 19:27   #14
Logannn
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 16
По умолчанию

Ага, с этим понятно.


Код:
int x;
scanf ("%d", x);
Помогите написать алгоритм для проверки к какому дата типу принадлежит введенное число и в случае ввода несоответствующего числа программа должна остановится.
Пробовал использовать INT_MAX, но чего то не получается.
Logannn вне форума Ответить с цитированием
Старый 16.01.2013, 22:08   #15
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
к какому дата типу принадлежит введенное число
К какому "дата типу" принадлежит число, записанное строкой "0" и почему?
А так - изучите, что возвращает функция scanf().
Abstraction вне форума Ответить с цитированием
Старый 16.01.2013, 23:11   #16
Logannn
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
К какому "дата типу" принадлежит число, записанное строкой "0" и почему?
А так - изучите, что возвращает функция scanf().
Про функцию scanf почитаю. Я считаю что число ноль принадлежит к всем типам данных(INT, SHORT,LONG..). В программе будут вводится числа х>0. Мне просто дали такое задание, вот я и спрашиваю.
Я пробовал делать что то наподобие:

Код:
if (SHRT_MIN<X<INT_MAX)
{
printf ("Тип данных ИНТ");
}
Logannn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск моды среди неизвестного кол-ва положительных чисел. c++ Trigger man Помощь студентам 1 27.08.2012 19:24
Нахождение моды в массиве. Maksimall89 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 15.11.2011 20:00
Нахождение месяца i.yakushev Помощь студентам 4 04.05.2011 20:16
моды и карты к half-life alhon Gamedev - cоздание игр: Unity, OpenGL, DirectX 14 05.10.2009 14:12