c语言学习

按位取数 
    定义一个无符号整数 unsigned int num;
    对第一位:%10;第二:/10%10;第三位:第三位:/100%10;
    采取循环来取位;

    unsinged int temp;
    while(temp){
        unsigned int position = temp %10;   去最后一位
        printf("%2d",position);             打印最后一位
        temp /= 10;                         更新变量
    }

    从左往右打印每一位
    采用递归:

    void digui(int num){
        递归终止条件
        if(!num){
            return;
        }
        递归操作:
        digui(num/10);
        printf("%2d",num%10);
    }

    斐波那契数列

    f(n)=f(n-1)+f(n-2)  (n>3)
    int arr[31] = {0};  arr[0]表示斐波那契的第0项
    void fib(int n) {
        递归终止的条件
        if(n==1 || n==2){
            arr[n] = 1;
            return 1;
        }
        递归操作
        if(arr[n] == 0){
            保存记录结果
            arr[n] = fib(n - 1) + fib(n - 2);
        }
        return arr[n];
    }
    void fib1() {
        int arr[31] = {0};
        原始问题
        arr[1] = arr[2] = 1;

        for(int i = 3;i < 31;i++){
            arr[i] = arr[i - 1] + arr[i - 2];
        }
    } 

    兔子生崽
    月份   小的      中的        老的         sum
    1      1         0           0             1
    2      0         1           0             1
    3      1         0           1             1
    4      1         1           1             2
    5      2         1           2             3
    6      3         2           3             8

    编写一个函数,不允许创建临时变量,统计字符串长度
    #include <string.h>
    void length() {
        字符串? 使用双引号""引起的一串字符
        字符?使用单引号''引起的
        char arr[] = "hello";
        求字符串长度
        int leng = strlen("hello");
        使用sizeof
        length = sizeof(arr) / sizeof(arr[0]) - 1;
    }

    int my_length(char arr[]) {
        int length = 0;
        int i = 0;
        while (arr[i++] != '\0'){
            length++;
        }
        return length;
    }
    简化
    int my_length(char arr[]) {
        int i = 0;
        while (!arr[i++]);
        return i-1;
    }

    使用递归:
    int srew(char *p) {
        //递归终止条件
        if(*p == '\0') {
            return 0;
        }
        //递归操作
        return 1+srew(p+1);
    }
    
    操作符和表达式
    (num1 * 1.0 / num2)(类型转换)
    整数在内存中肯定是以二进制的形式进行存储,而且存储的是补码
    移位操作符
    <<左移操作符:左边抛弃,右边补零
    int num = 10;
    移动的是二进制位   左边抛弃,右边补零
    int temp = num << 1;
    输出结果:20
    temp = temp << 1;
    输出结果:40
    >>右移运算:逻辑移位与算数移位
    逻辑移位:右边丢弃,左边用零补充
    算术右移:除2(右边丢弃,左边补符号位
    不能移动负数
    按位或& 都是1才是1
    按位与| 只要有1就是1
    按位异或^ 相同即为0不同即为1

    不使用临时变量实现数与数之间的交换
    距离法:
    a = 3, b = 5;
    b = b-a;               a = 3, b = 2
    a = a + b;               a=5,b=2
    b=a-b;                 a=5,b=3
    
    使用异或操作符;
    a=a^b;
    b=a^b;
    a=a^b;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值