算法两则

一、鸡兔同笼

已知共有鸡和兔共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
原文地址:https://www.cnblogs.com/dedeblog/p/6061058.html