Каков наилучший способ хранения больших базовых чисел B, чтобы операции, такие как сдвиг вправо и проверка наименее значимого бита, могли быть выполнены эффективно?Лучший способ хранения больших базовых номеров B?
На самом деле, я наткнулся на интервью вопрос, который говорит, что
Given two numbers N and K such that 0<=N<=1000 and 0<=K<=1000^1000. I need
to check that whether N^N = K or not. For example:
if N=2 and K=4 , 2^2 = 4 so return true;
if N=3 and K=26 , 3^3 != 26 so return false
То, что я думал, что если я считаю base N number system
, то N^N
будет эквивалентно 1 followed by N zero
в нем. Например, для N = 2, 2^2 = 100 (в базе 2), для N = 3, 3^3 = 1000 (в базе 3). Затем я могу легко написать функцию, чтобы определить, есть ли K = N^N
или нет.
int check(unsigned long int N, unsigned long int K)
{
unsigned long int i;
for (i=0; i<N; i++)
{
if (K%N != 0) //checking whether LSB is 0 or not in base N number system
return 0;
K = K/N; //right shift K by one.
}
return (K==1);
}
В настоящее время существует две основные проблемы, связанные с этой функцией:
1) An unsigned long int is not sufficient to store large numbers of range 0
to 1000^1000.
2) The modulus and the division operations makes it every less efficient.
Для того, чтобы сделать его эффективным, Ищу какой-то способ для представления большой базы N чисел, так что я могу выполнить сдвиг вправо и эффективно проверять операции с наименее значимыми бит. Кто-нибудь раньше сталкивался с этим? Или кто-нибудь знает какой-либо другой способ эффективно решить эту проблему?
В какой форме указаны первоначально цифры? Если вы хотите представить 'K' в базе' N', как правило, вам нужно выполнить разделение, чтобы вы не купили ничего, кроме деления и проверки. –
Что говорит Даниил: даже если у вас есть такая структура данных, преобразование 'K' в базовое представление N, чтобы подключить его к структуре данных, - это в значительной степени проблема, с которой вы сталкиваетесь. Это эквивалентно всем этим разделам и модулям. –
@ DanielFischer: На самом деле, я прочитал этот вопрос в Интернете http://www.careercup.com/question?id=13880754, где не указана информация об исходных номерах, кроме диапазона. Тогда, я думаю, вы можете считать это своим комфортом, что поможет вам эффективно решить проблему. –