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;
    }
  • 相关阅读:
    python中的编码问题
    CVPR2018 Tutorial 之 Visual Recognition and Beyond
    hdu 1376 Octal Fractions
    hdu 1329 Hanoi Tower Troubles Again!
    hdu 1309 Loansome Car Buyer
    hdu 1333 Smith Numbers
    hdu 1288 Hat's Tea
    hdu 1284 钱币兑换问题
    hdu 1275 两车追及或相遇问题
    hdu 1270 小希的数表
  • 原文地址:https://www.cnblogs.com/lkimprove/p/10478890.html
Copyright © 2011-2022 走看看