- 论坛徽章:
- 0
|
f(n)=x表示从1到n出现1的个数为x。例如f(1)=1, f(13)=6,f(19)=20.求10,0000,0000以内所有满足f(n)=n的数。我的算法大概6.65秒。而且是线性的。
int BuildAdv( int count )
{
int prev = 0;
int cur = 0;
int delt = 0;
int rt = 0;
char number[13]= "000000000000";
for (int i = 1; i < count; i++ )
{
for (int j = 11; j >= 0; j-- )
{
if ( number[j] == '9' )
{
number[j] = '0';
}
else
{
if ( number[j] == '0' )
{
delt++;
}
if ( number[j] == '1' )
{
delt--;
}
number[j] += 1;
break;
}
}
cur = prev + delt;
prev = cur;
if ( i == cur )
{
printf("result:%d\n", i );
rt = i;
}
}
return rt;
}
int main( int argc, char* argv[] )
{
int number = 1000000000;
DWORD d2 = GetTickCount();
int y = BuildAdv(number);
DWORD d3 = GetTickCount();
printf("BuildAdv use:%d\n", d3-d2);
return 0;
}
[ 本帖最后由 runforu 于 2008-8-6 10:48 编辑 ] |
|