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("\n");
    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("请输入两个整数:\n");
    scanf("%d %d", &a, &b);
    Average(a, b);

    printf("\n");
    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("\n");
    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 != '\0')){
            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("\n");
    system("pause");
    return 0;
}

 

posted @ 2019-03-05 19:07  lkimprove  阅读(107)  评论(0编辑  收藏  举报