Work_12

一个数组中只有两个数字是出现一次,
其他所有数字都出现了两次。
找出这两个数字,编程实现。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//找数字
void Number(int* arr, int size){
    int str1[10], str2[10], str3[2];
    //将所有的数字异或一遍,得到单独出现的数字的异或结果
    int cur = arr[0];
    for (int i = 1; i < size; i++){
        cur = cur ^ arr[i];
    }
    //找到异或结果二进制位中的一个1
    int j = 0;
    for (j = 0; j < 32; j++){
        int temp = cur & (1 << j);
        if (temp){
            break;
        }
    }
    //按照此位有无1将arr分成两组
    int m = 0;
    int n = 0;
    for (int i = 0; i < size; i++){
        if (arr[i] & (1 << j)){
            str1[m] = arr[i];
            m++;
        }
        else {
            str2[n] = arr[i];
            n++;
        }
    }
    //将两组数分别异或,找出每组中出现一次的数字
    str3[0] = str1[0];
    for (int i = 1; i < m; i++){
        str3[0] = str1[i] ^ str3[0];
    }
    str3[1] = str2[0];
    for (int i = 1; i < n; i++){
        str3[1] = str2[i] ^ str3[1];
    }
    printf("只出现一次的数字为:%d和%d", str3[0], str3[1]);

}


int main(){
    int arr[10] = { 1, 2, 2, 3, 3, 4, 4, 5, 5, 6 };
    int size = sizeof(arr) / sizeof(arr[0]);
    Number(arr, size);

    printf("\n");
    system("pause");
    return 0;
}

 

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,
给20元,可以多少汽水。
编程实现。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//喝汽水
int Drink_bottle(int money){
    int bottle = money / 1;
    int drink_bottle = bottle;
    while (bottle >= 2){
        bottle = bottle - 2;
        //两个空瓶子换一瓶汽水
        drink_bottle++;
        bottle++;
    }
    return drink_bottle;
}

int main(){
    int result = 0;
    int money;
    printf("请输入钱数:");
    scanf("%d", &money);
    result = Drink_bottle(money);
    printf("该钱可以喝到的汽水数为:");
    printf("%d", result);

    printf("\n");
    system("pause");
    return 0;
}

 

模拟实现strcpy

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

char* Strcpy(char* str1, const char* str2){
    //参数合法性的校验
    //虽然要求str1必须大于str2,但此场景下受限,无法做到
    assert(str1 != NULL);
    assert(str2 != NULL);
    int i;
    for (i = 0; str2[i] != '\0'; i++){
        str1[i] = str2[i];
    }
    //注意'\0'的copy
    str1[i] = '\0';
    return str1;
}

int main(){
    char str1[20] = "i am a student";
    char str2[30];
    Strcpy(str2, str1);
    printf("%s", str2);

    printf("\n");
    system("pause");
    return 0;
}

 

模拟实现strcat

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

char* Strcat(char* str1, const char* str2){
    //判断参数是否合法
    assert(str1 != NULL);
    assert(str2 != NULL);
    //寻找原字符串str1的结尾
    int i = 0;
    for (; str1[i] != '\0'; i++){

    }
    //将str2连接到str1后
    for (int j = 0; str2[j] != '\0'; j++, i++){
        str1[i] = str2[j];
    }
    //给str1加上'\0';
    str1[i] = '\0';
    return str1;
}

int main(){
    char str1[80] = "i am a ";
    char str2[10] = "student";
    Strcat(str1, str2);
    printf("%s", str1);

    printf("\n");
    system("pause");
    return 0;
}

 

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