今天实验室的林大牛给我发了一道百度面试题:
“求符合指定规则的数。
给定函数d(n) = n + n的各位之和,n为正整数,如 d(78) = 78+7+8=93。 这样这个函数可以看成一个生成器,如93可以看成由78生成。
定义数A:数A找不到一个数B可以由d(B)=A,即A不能由其他数生成。现在要写程序,找出 1至10000里的所有符合数A定义的数”
我自己实现了一下,写的实在太烂。就不贴出来,直接把大牛的代码拿过来消化吸收改进了一下,挂在这里,望各位苦逼程序猿有所收获。
#include <stdio.h>
#define MAX_AREA 1000
int DNumber()
{
int mem_tmp[MAX_AREA / 32 + 1] = {0};
unsigned int tmp, j;
for (int i = 0; i < MAX_AREA; ++i)
{
tmp = j = i;
do {
tmp += j % 10;
j /= 10;
} while (j != 0);
if(tmp > MAX_AREA)
{
continue;
}
j = 1;
mem_tmp[tmp / 32] |= j << tmp % 32;
}
for (int i = 0; i < MAX_AREA; ++i)
{
j = mem_tmp[i/32];
if(0 == (j << (31 - i%32) >> 31))
printf("%d ",i);
}
return 0;
}
int main()
{
DNumber();
return 0;
}
思路请参考http://astar.baidu.com/forum/forum.php?mod=viewthread&tid=733,无奈C中没有bool关键字,因此怎样操作int数据的位是此题的关键。
源代码测试通过。