算法两则
一、鸡兔同笼
已知共有鸡和兔共15只,共有40只脚,问:鸡和兔各有几只?
一般人看见这样的问题都是立刻想到二元一次方程式,一下就解决了,其实还有更简单的,不用写算式,心算可以出结果。
新算法:
假设鸡和兔都训练有素,吹一声哨,抬起两只脚,40-15*2 = 10,此时鸡都屁股坐地了,剩下都是兔子两脚战地,故:
兔子数量:10 / 2 = 5(只) 鸡的数量:15 - 5 = 10(只)
二、字符(字符串)转二进制数组
刚刚开始学习C语言时候,会练习打印一个字符的二进制形式,又因为平时学习二进制转换时,都是循环除的方式得出二进制形式,故经常写的 C 语言代码:
int num = 10; int i = 0; int temp = 0; int arr[8] = {0}; while (num) { arr[i] = num % 2; num /= 2; i++; } for (i = 0; i < 4; i++) { temp = arr[i]; arr[i] = arr[7-i]; arr[7-i] = temp; }
这样写出来看起来比较臃肿,其实可以进行优化。当学习了C 语言的位操作之后,就可以优化的很简单了:
int num = 10; for (int j = 0; j < 8; j++) { temp = num << j; //j:取出字符第 j 位数值 循环左移j位 temp = temp & 0x80; //按位与,取出最高位 此处防止32位寄存器处理时,num高位值在更高的位置保留,没有达到置零效果,进而影响后一步取值出错 arr[j] = temp >> 7; //右移7位,取出需要的值 }
ded3