zoukankan      html  css  js  c++  java
  • Work_9

    编写函数:
    unsigned int reverse_bit(unsigned int value);
    这个函数的返回值value的二进制位模式从左到右翻转后的值。
    如:
    在32位机器上25这个值包含下列各位:
    00000000000000000000000000011001
    翻转后:(2550136832)
    10011000000000000000000000000000
    程序结果返回:
    2550136832

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    
    //按二进制翻转
    unsigned int Reverse_bit(unsigned int value){
        //法一:
        //从左找到第一个为1的二进制数的位置
        int count = 0;
        for (int i = 31; i > 0; i--){
            int temp;
            //当其二进制的某一位为1时,和1与为1
            temp = value & (1 << i);
            count++;
            if (temp != 0){
                break;
            }
        }
        unsigned  int sum = 0;
        unsigned int temp;
        int i = 32 - count;
        for (; i >= 0; i--){
            //从左数,将第一个“1”提出来(除它以外,全部变成0)
            //通过循环,继续将后续的数依次提出来
            temp = value & (1 << i);
            //减去它后面位数的二倍,再将此数放于第一位:0010 => 01 => 10
            temp = temp << (32 - i * 2 - 1);
            //通过循环,将这些数加起来
            sum = sum + temp;
        }
        return sum;
    
        ////法二:
        //unsigned int sum = 0;
        //int i = 1;
        //for (i = 1; i <= 32; i++){
        //    //判断该位是否为1
        //    unsigned int cur = value >> (i - 1) & 1;
        //    //第1位翻转后为2 ^ 31 , 第2位翻转后为2 ^ 30,
        //    //第i位翻转后位2 ^ (32 -1)
        //    sum +=  cur * pow(2, 32 - i);
        //}
        //return sum;
    }
    
    int main(){
    
        unsigned int input;
        printf("请输入一个整数:");
        scanf("%u", &input);
        printf("翻转后的整数为:");
        printf("%u", Reverse_bit(input));
    
        printf("
    ");
        system("pause");
        return 0;
    }

    不使用(a+b)/2这种方式,求两个数的平均值。

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    
    //求平均数
    void Average(int a, int b){
        //获得两个数的差值
        int temp = a > b ? (a - b) : (b - a);
        //平均数 = 差值的一半加上较小的那个数
        int aver = a > b ? (b + temp / 2) : (a + temp / 2);
        printf("这两个数的平均数为:%d", aver);
    }
    
    int main(){
        int a, b;
        printf("请输入两个整数:
    ");
        scanf("%d %d", &a, &b);
        Average(a, b);
    
        printf("
    ");
        system("pause");
        return 0;
    }

    编程实现:
    一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。
    请找出这个数字。(使用位运算)

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    
    //找单一的数字
    int Number(int arr[], int size){
        int sign = arr[0];
        //将数组中的每一个数都进行与或,
        //成双的数字与或为0,则留下的数字为单一的数字
        for (int i = 1; i < size; i++){
            sign = sign ^ arr[i];
        }
        return sign;
    }
    
    int main(){
        int arr[11] = { 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5 };
        int size = sizeof(arr) / sizeof(arr[0]);
        int result = 0;
        result = Number(arr, size);
        printf("出现一次的数据为:%d", result);
    
        printf("
    ");
        system("pause");
        return 0;
    }

    有一个字符数组的内容为:"student a am i",
    请你将数组的内容改为"i am a student".
    要求:
    不能使用库函数。
    只能开辟有限个空间(空间个数和字符串的长度无关)。
    如:
    student a am i
    i ma a tneduts
    i am a student

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    
    //字符串的整体逆转
    void Reverse_string(char* start, char* end){
        while (start < end){
            char temp = *start;
            *start = *end;
            *end = temp;
            start++;
            end--;
        }
    }
    
    //求字符串长度
    int Mystrlen(char* str){
        int count = 0;
        while (*str){
            count++;
            str++;
        }
        return count;
    }
    
    //逆转字符串
    void Mystring(char* str){
        char* start = str;
        char* end = str + Mystrlen(str) - 1;
        //整体逆转
        Reverse_string(start, end);
        //局部逆转
        char* cur = str;
        while (*cur){
            char* sub_start = cur;
            while ((*cur != ' ') && (*cur != '')){
                cur++;
            }
            char* sub_end = cur - 1;
            //逆转字串
            Reverse_string(sub_start, sub_end);
            while (*cur == ' '){
                cur++;
            }
        }
    }
    
    int main(){
        char* str[1024];
        //scanf("%s", str);
        //scanf函数在读取字符串时,当遇到空格时会停止读取
        gets(str);
        Mystring(str);
        printf("%s", str);
    
        printf("
    ");
        system("pause");
        return 0;
    }
  • 相关阅读:
    SQL语句熟悉
    CSS3 attribute
    轮播器
    PHP 邮箱操作的Action
    Hole puncher Show Picture
    力扣算法——133.CloneGraph【M】
    力扣算法——134GasStation【M】
    力扣算法——135Candy【H】
    力扣算法——136SingleNumber【E】
    力扣算法——137SingleNumberII【M】
  • 原文地址:https://www.cnblogs.com/lkimprove/p/10478890.html
Copyright © 2011-2022 走看看