有一个表达式:[x/2] + y + x * y,x和y是正整数,[x/2]表示向下取整,例如[3/2] = 1。有些正整数可以'不是用这个表达式来表达的,比如1、3。现在的问题是如何快速找出前40个数字?
当 x = 1 时,表达式为 2*y,所以这个数不能是偶数。当 y = 1 时,表达式为 [x/2] + x + 1,不包括 3*n。然后我尝试如下:
int64_t givean( int n )
{
if( n == 1 ) return 1;
if( n == 2 ) return 3;
int i = 3;
int count = 2;
while( true ){
int64_t m = i * 3;
bool ok = true;
for( int x = 3; x <= ( 2*m - 2 ) / 3; x++ ){
if( ( x / 2 + x + 1 ) >= m ){
ok = false;
}
if( !( ( m - x/2 ) % ( x + 1 ) ) ){
ok = false;
break;
}
}
if( ok && ++count == n ){
return m;
}
i += 2;
}
}
前7个数字可以很快找到,找到第八个数字大约需要2分钟......前8个数字是:
1
3
15
63
4095
65535
262143
1073741823
有没有其他高性能算法来解决这个问题?