Как найти цифру единиц определенной мощности самым простым способом - PullRequest
10 голосов
/ 27 августа 2011

Как узнать цифру единиц определенного числа (например, 3 power 2011). Какую логику я должен использовать, чтобы найти ответ на эту проблему?

Ответы [ 10 ]

21 голосов
/ 27 августа 2011

Для базы 3:

3^1 = 3
3^2 = 9
3^3 = 27
3^4 = 81
3^5 = 243
3^6 = 729
3^7 = 2187
...

То есть цифра единиц имеет только 4 возможности, а затем она повторяется в одном и том же цикле.

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

2^7 % 10 = 128 % 10 = 8 

Также можно показать (и довольно интуитивно понятно), что для произвольной базы цифра единиц любой мощности будет зависеть только от цифры единиц самой базы - то есть 2013 ^ 2013 имеет ту же цифру единиц, что и 3 ^ 2013.

Мы можем использовать оба факта для создания чрезвычайно быстрого алгоритма (спасибо за help - с любезного разрешения я могу представить намного более быструю версию).

Идея такова: поскольку мы знаем, что для любого числа 0-9 будет не более 4 различных результатов, мы можем также сохранить их в таблице поиска:

{ 0,0,0,0, 1,1,1,1, 6,2,4,8, 1,3,9,7, 6,4,6,4, 
  5,5,5,5, 6,6,6,6, 1,7,9,3, 6,8,4,2, 1,9,1,9 }

Это возможные результаты для 0-9 в этом порядке, сгруппированные по четыре. Идея теперь для возведения в степень n ^ a до

  • сначала возьми базовый мод 10 =>: = i
  • перейти к индексу 4*i в нашей таблице (это начальное смещение этой конкретной цифры)
  • возьмите показатель степени 4 =>: = off (как указано в теореме Эйлера, у нас есть только четыре возможных результата!)
  • добавьте off к 4*i, чтобы получить результат

Теперь, чтобы сделать это как можно более эффективным, к базовым арифметическим операциям применены некоторые настройки:

  • Умножение на 4 эквивалентно сдвигу влево на два ('<< 2') </li>
  • Взятие числа a % 4 эквивалентно произнесению a&3 (маскировка 1 и 2 бита, которые образуют остаток% 4)

Алгоритм в C :

static int table[] = {
    0, 0, 0, 0, 1, 1, 1, 1, 6, 2, 4, 8, 1, 3, 9, 7, 6, 4, 6, 4, 
    5, 5, 5, 5, 6, 6, 6, 6, 1, 7, 9, 3, 6, 8, 4, 2, 1, 9, 1, 9
};

int /* assume n>=0, a>0 */ 
unit_digit(int n, int a)
{
    return table[((n%10)<<2)+(a&3)];
}

Подтверждение первоначальных претензий

Из наблюдений мы заметили, что цифра единиц для 3 ^ x повторяется в каждой четвертой степени. Утверждение состояло в том, что это верно для любого целого числа. Но как это на самом деле доказано? Оказывается, с помощью модульной арифметики довольно легко. Если нас интересует только цифра единиц измерения, мы можем выполнить наши вычисления по модулю 10. Это эквивалентно тому, что цифры единиц измерения повторяются после 4 показателей или

a^4 congruent 1 mod 10

Если это так, то, например,

a^5 mod 10 = a^4 * a^1 mod 10 = a^4 mod 10 * a^1 mod 10 = a^1 mod 10

то есть, ^ 5 дает ту же цифру, что и ^ 1 и т. Д.

Из по теореме Эйлера мы знаем, что

a^phi(10) mod 10 = 1 mod 10

где phi (10) - это числа от 1 до 10, которые взаимно просты с 10 (то есть их gcd равен 1). Числа <10, взаимно простые с 10, равны 1,3,7 и 9. Итак, phi (10) = 4, и это доказывает, что на самом деле <code>a^4 mod 10 = 1 mod 10.

Последнее утверждение, которое нужно доказать, состоит в том, что для возведения в степень, где база> = 10, достаточно просто взглянуть на цифру единиц базы. Допустим, наша база x> = 10, поэтому мы можем сказать, что x = x_0 + 10 * x_1 + 100 * x_2 + ... (представление базы 10)

Используя модульное представление, легко увидеть, что действительно

x ^ y mod 10
= (x_0 + 10*x_1 + 100*x_2 + ...) ^ y mod 10
= x_0^y + a_1 * (10*x_1)^y-1 + a_2 * (100*x_2)^y-2 + ... + a_n * (10^n) mod 10
= x_0^y mod 10  

где a_i - коэффициенты, которые включают степени x_0, но, в конечном итоге, не имеют значения, поскольку все произведение a_i * (10 * x_i) ^ y-i будет делиться на 10.

8 голосов
/ 27 августа 2011

Вы должны посмотреть на Модульное возведение в степень .То, что вы хотите, - это то же самое, что и вычисление n ^ e (mod m) при m = 10. Это то же самое, что и вычисление остатка от деления на десять из n ^ e.

Вам, вероятно, интересен двоичный метод справа налево для его вычисления, поскольку он наиболее эффективен по времени и самый простой , не слишком сложный для реализации.Вот псевдокод из Википедии:

function modular_pow(base, exponent, modulus)
    result := 1
    while exponent > 0
        if (exponent & 1) equals 1:
           result = (result * base) mod modulus
        exponent := exponent >> 1
        base = (base * base) mod modulus
    return result

После этого просто назовите его с модулем = 10 для желаемой базы и показателя степени, и вот ваш ответ.

РЕДАКТИРОВАТЬ: для еще более простогометод, менее эффективный с точки зрения процессора, но с большей памятью, ознакомьтесь с разделом «Эффективная память» статьи в Википедии.Логика достаточно проста:

function modular_pow(base, exponent, modulus)
    c := 1
    for e_prime = 1 to exponent 
        c := (c * base) mod modulus
    return c
8 голосов
/ 27 августа 2011

Я уверен, что есть правильный математический способ решить эту проблему, но я бы предложил, поскольку, поскольку вы заботитесь только о последней цифре, и поскольку в теории каждое число, умноженное на себя многократно, должно в конечном итоге генерировать повторяющийся паттерн (если смотреть только на последняя цифра), вы можете просто выполнять умножения до тех пор, пока вы не обнаружите первое повторение, а затем отобразите свой показатель степени в соответствующую позицию в построенном вами шаблоне.

Обратите внимание, что, поскольку вы заботитесь только о последней цифре, вы можете еще больше упростить вещи, укоротив свой входной номер до его цифры до того, как вы начнете строить отображение шаблона. Это позволит вам определить последнюю цифру даже для произвольно больших входных данных, которые в противном случае могли бы вызвать переполнение при первом или втором умножении.

Вот базовый пример в JavaScript: http://jsfiddle.net/dtyuA/2/

И последняя цифра в 3^2011, кстати, 7.

3 голосов
/ 28 августа 2011

Ключ к решению этого типа вопроса лежит в Теорема Эйлера .

Эта теорема позволяет нам сказать, что a ^ phi (m) mod m = 1 mod m, если и только если a и m взаимно просты. То есть а и м не делятся поровну. Если это так (и для вашего примера), мы можем решить эту проблему на бумаге, без какого-либо программирования.

Давайте найдем единичную цифру 3 ^ 2011, как в вашем примере. Это эквивалентно 3 ^ 2011 мод 10.

Первый шаг - проверить, что 3 и 10 совпадают. Они не делятся равномерно, поэтому мы можем использовать теорему Эйлера.

Нам также необходимо вычислить значение totient , или phi, для 10. Для 10 это 4. Для 100 ph это 40, 1000 для 4000 и т. Д.

Используя теорему Эйлера, мы можем видеть, что 3 ^ 4 mod 10 = 1. Затем мы можем переписать оригинальный пример как:

3^2011 mod 10 = 3^(4*502 + 3) mod 10 = 3^(4*502) mod 10 + 3^3 mod 10 = 1^502 * 3^3 mod 10 = 27 mod 10 = 7

Таким образом, последняя цифра 3 ^ 2011 - 7.

Как вы видели, для этого не требовалось никакого программирования, и я решил этот пример на клочке бумаги.

3 голосов
/ 27 августа 2011

Мы можем начать с проверки последней цифры каждого результата, полученного путем поднятия 10 основных цифр до последовательных степеней:

d      d^2    d^3    d^4    d^5    d^6    d^7    d^8    d^9 (mod 10)
---    ---    ---    ---    ---    ---    ---    ---    ---
0      0      0      0      0      0      0      0      0
1      1      1      1      1      1      1      1      1
2      4      8      6      2      4      8      6      2
3      9      7      1      3      9      7      1      3
4      6      4      6      4      6      4      6      4
5      5      5      5      5      5      5      5      5
6      6      6      6      6      6      6      6      6
7      9      3      1      7      9      3      1      7
8      4      2      6      8      4      2      6      8
9      1      9      1      9      1      9      1      9

Мы можем видеть, что во всех случаях последняя цифра циклически проходит не более четырехотличные значения.Используя этот факт и предполагая, что n является неотрицательным целым числом, а p является положительным целым числом, мы можем вычислить результат довольно напрямую (например, в Javascript):

function lastDigit(n, p) {
    var d = n % 10;
    return [d, (d*d)%10, (d*d*d)%10, (d*d*d*d)%10][(p-1) % 4];
}

...или даже проще:

function lastDigit(n, p) {
    return Math.pow(n % 10, (p-1) % 4 + 1) % 10;
}

lastDigit(3, 2011)
/* 7 */

Вторая функция эквивалентна первой.Обратите внимание, что, хотя он использует возведение в степень, он никогда не работает с числом больше девяти до четвертой степени (6561).

1 голос
/ 22 апреля 2013

Ты делаешь простые вещи сложными.

Предположим, вы хотите узнать единичную цифру abc ^ xyz.

divide the power xyz by 4,if remainder is 1 ans is c^1=c.
 if xyz%4=2 ans is unit digit of  c^2.
 else if xyz%4=3 ans is unit digit of  c^3.

 if xyz%4=0 
 then we need to check whether c is 5,then ans is 5
  if c is even ans is 6
 if c is odd (other than 5 ) ans is 1.
0 голосов
/ 03 апреля 2017

Если у вас число и показатель степени разделены, это легко.

Пусть n1 - это число, а n2 - это степень.И ** представляет мощность.

предполагается, что n1> 0.

% означает деление по модулю.

псевдокод будет выглядеть следующим образом

def last_digit(n1, n2)
  if n2==0 then return 1 end
  last = n1%10
  mod = (n2%4).zero? ? 4 : (n2%4)
  last_digit = (last**mod)%10
end

Пояснение:

Нам нужно учитывать только последнюю цифру числа, поскольку она определяет последнюю цифру степени.это свойство математики, которое подсчитывает вероятность того, что последняя цифра степени каждой цифры (0-9) не больше 4.

1) Теперь, если показатель степени равен нулю, мы знаем, что последняя цифра будет 1.

2) Получите последнюю цифру на% 10 для числа (n1)

3)% 4 для показателя степени (n2) - если выходное значение равно нулю, мы должны считать это 4, потому что n2 можетне ноль.если% 4 не равен нулю, мы должны рассмотреть значение% 4.

4) теперь мы имеем самое большее 9 ** 4.Это легко для компьютера рассчитать.возьми% 10 на это число.У вас есть последняя цифра.

0 голосов
/ 26 февраля 2013

Найдите повторяющийся набор в этом случае, это 3,9,7,1, и он повторяется в том же порядке навсегда .... так что разделите 2011 на 4, что даст вам напоминание 3. Это третий элемент вповторяющийся набор.Это самый простой способ найти для любого данного нет.скажем, если попросить 3 ^ 31, то напоминание о 31/4 будет 3, и поэтому 7 - это единица измерения.для 3 ^ 9, 9/4 равно 1, и поэтому единица будет 3. 3 ^ 100, единица будет 1.

0 голосов
/ 28 августа 2011

Вот трюк, который работает для чисел, которые не кратны коэффициенту основания (для базы 10 он не может быть кратен 2 или 5.) Давайте использовать базу 3. Что вы пытаетесьнайти - 3 ^ 2011 mod 10. Найти степени 3, начиная с 3 ^ 1, до тех пор, пока вы не найдете одно с последней цифрой 1. Для 3 вы получите 3 ^ 4 = 81.Запишите исходную силу как (3 ^ 4) ^ 502 * 3 ^ 3.Используя модульную арифметику, (3 ^ 4) ^ 502 * 3 ^ 3 соответствует (имеет ту же последнюю цифру, что и) 1 ^ 502 * 3 ^ 3.Таким образом, 3 ^ 2011 и 3 ^ 3 имеют одну и ту же последнюю цифру, которая равна 7.

Вот некоторый псевдокод, чтобы объяснить это в целом.Это находит последнюю цифру b ^ n в базе B.

// Find the smallest power of b ending in 1.
i=1
while ((b^i % B) != 1) {
    i++
}
// b^i has the last digit 1

a=n % i
// For some value of j, b^n == (b^i)^j * b^a, which is congruent to b^a
return b^a % B

Вы должны быть осторожны, чтобы предотвратить бесконечный цикл, если никакая степень b не заканчивается на 1 (в базе 10, кратной2 или 5 не работают.)

0 голосов
/ 27 августа 2011

Сильфон представляет собой таблицу с мощностью и единицей цифры от 3 до этой степени.0 11 32 93 74 15 36 97 7

Используя эту таблицу, вы можете видеть, что единичная цифра может быть 1, 3, 9, 7, и последовательность повторяется в этом порядке для более высоких степеней 3. Используя эту логику, вы можете обнаружить, что единичная цифра (3 power 2011) равен 7. Вы можете использовать тот же алгоритм для общего случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...