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; }