数字拆解算法
随机给定一个数,要把它拆成有多少个4、8、12、16,
拆解顺序是从大到小,
例如
随机给出17,应该拆出 一个16及余数1,而不是四个4及1。
又如,25,拆成 一个16,一个8,余1
如此类推。
希望求一个精简一点的方法,程序越少越好。
最好是一条公式。
[解决办法]
- Java code
long src=12345L; System.out.println("16*"+(src>>4)); System.out.println("12*"+(src&=0xF)/12); System.out.println("08*"+(12>src&&src>7?1:0)); System.out.println("04*"+(8>src&&src>3?1:0));
[解决办法]
- C/C++ code
void split( int n ) { const char* tbl[] = { "","1*1","1*2", "1*3", "4*1", "4*1+1*1", "4*1+1*2", "4*1+1*3", "8*1", "8*1+1*1", "8*1+1*2", "8*1+1*3","12*1","12*1+1*1", "12*1+1*2","12*1+1*3" }; if( n >= 16 ) printf( "16*%d+", n>>4 ); printf( "%s\n", tbl[n&0xf] );}
[解决办法]
i_16=x&~0xf/16;
i_12=(x&0xf>=12)?1:0 ;
i_8= (x&0xf<12)&&(x&0xf>=8) ?1:0;
i_4= (x&0xf<8)&&(x&0xf>=4 ) ?1:0 ;
i_2=(x&0xf<4)&&(x&0xf>=2 )?1:0;