#include #define MAX_STEP 1024 #define MAX_BIT 31 int state0[MAX_STEP]; int state1[MAX_STEP]; int bit_table[MAX_BIT]; void init_table() { int i,n; n=1; for ( i=0 ; i < MAX_BIT ; i++ ) { bit_table[i] = n; n<<=1; } } int search_max_bit(int n) { int i; for ( i=MAX_BIT ; i >= 0 ; i-- ) { if ( n & bit_table[i] ) { return i+1; } } return 0; } int count_1_num(int n) { int i,num; num=0; for ( i=MAX_BIT ; i>=0 ; i-- ) { if ( n & bit_table[i] ) { num++; } } return num; } int count_0_num(int n) { int i,num; int max; num=0; max = search_max_bit(n)-1; for ( i=max ; i>=0 ; i-- ) { if ( (n & bit_table[i]) ==0 ) { num++; } } return num; } int search(int a, int b) { int i,j; int num0, num1; int n0a,n0b,n1a,n1b; state0[0] = a; state1[0] = b; num0=a; num1=b; for ( i=0 ; i < MAX_STEP-1 ; i++ ) { n0a = count_0_num(num0); n0b = count_0_num(num1); n1a = count_1_num(num0); n1b = count_1_num(num1); num0 = n0a+n0b+1; num1 = n1a+n1b+1; for ( j=i ; j >= 0 ; j-- ) { if ( (num0==state0[j]) && (num1 == state1[j]) ) { return i; } } state0[i+1] = num0; state1[i+1] = num1; printf("[%d] num0:%d, num1:%d\n",i,num0,num1); } return -1 ; } int main(int argc, char **argv) { int seed1, seed2; if ( argc != 3 ) { printf("usage : PROMPT> num_pan num1 num2\n"); printf("example : PROMPT> num_pan 4 6\n"); return 1; } seed1 = atoi(argv[1]); seed2 = atoi(argv[2]); init_table(); search(seed1,seed2); return 0; }