Пытался решить это. Предположение, что проблема состоит в том, что двоичные представления числа «степени двух» по умолчанию являются K разреженными, несколько запутанно и противоречиво.
То, что я понял, было 8 -> 1000 - это 2 степени 3, поэтому 8 - это 3 разреженных. 16 -> 10000 2 степени 4, а значит и 4 разреженных.
Даже если мы предполагаем, что это правда, и, если вас интересует ниже, мой код решения (C) для этой проблемы. Не правильно обрабатывает некоторые случаи, когда между двумя входными числами участвуют степени двух чисел, пытаясь понять, могу ли я это исправить:
int sparse_binary_count (const string &S,const string &T,int K)
{
char buf[50];
char *str1,*tptr,*Sstr,*Tstr;
int i,len1,len2,cnt=0;
long int num1,num2;
char *pend,*ch;
Sstr = (char *)S.c_str();
Tstr = (char *)T.c_str();
str1 = (char *)malloc(300001);
tptr = str1;
num1 = strtol(Sstr,&pend,2);
num2 = strtol(Tstr,&pend,2);
for(i=0;i<K;i++)
{
buf[i] = '0';
}
buf[i] = '\0';
for(i=num1;i<=num2;i++)
{
str1 = tptr;
if( (i & (i-1))==0)
{
if(i >= (pow((float)2,(float)K)))
{
cnt++;
continue;
}
}
str1 = myitoa(i,str1,2);
ch = strstr(str1,buf);
if(ch == NULL)
continue;
else
{
if((i % 2) != 0)
cnt++;
}
}
return cnt;
}
char* myitoa(int val, char *buf, int base){
int i = 299999;
int cnt=0;
for(; val && i ; --i, val /= base)
{
buf[i] = "0123456789abcdef"[val % base];
cnt++;
}
buf[i+cnt+1] = '\0';
return &buf[i+1];
}