diff --git a/code/answear/advanced C/test/02/01 实现atoi/MyAtoi.c b/code/answear/advanced C/test/02/01 实现atoi/MyAtoi.c new file mode 100644 index 0000000..4decb25 --- /dev/null +++ b/code/answear/advanced C/test/02/01 实现atoi/MyAtoi.c @@ -0,0 +1,77 @@ +#define _CRT_SECURE_NO_WARNINGS 1 + +// atoi ʵ +// ElementType atoi( const char *str ); +//ת str ַָֽеֵ + +//κοհ׷ֱҵ׸ǿհ׷ȻվַܶɺϷʾת֮ΪֵϷֵв֣ + +//(ѡ) 򸺺 +//λ + +#include +#include + +#define MAXSIZE 100 + +typedef long long ElementType; + +ElementType MyAtoi(const char* str); +ElementType StrToNum(int numbers[], int size); + +int main(void) { + + char str[MAXSIZE]; + ElementType NumInStr; + + scanf("%s", str); + + NumInStr = MyAtoi(str); + + printf("%lld\n", NumInStr);// תɴҪı printf ת˵ + + return 0; +} + +ElementType MyAtoi(const char* str) { + + ElementType ret = 0; + int isFirstNumber = 1; + int flg = 1; + int numbers[MAXSIZE]; + int size = 0; + + while (*str != '\0') { + + if (*str >= '0' && *str <= '9') { + // жǷΪһֵ֣ǣҪжǰһַǷ - + if (isFirstNumber) { + if (*(str - 1) == '-') + flg = -1; + isFirstNumber = 0; + } + // ֱӽַתΪַڣõĿֵÿһλȨأ + numbers[size++] = *str - '0';// ֶӦ ACSII ֵȥ 0Ӧ ASCII ֵʵʾֵ + } + ++str; + } + + ret = StrToNum(numbers, size); + + return (flg * ret); +} + +ElementType StrToNum(int numbers[], int size) { + + ElementType ret = 0; + ElementType weight = 1; + int i; + + for (i = size - 1; i >= 0; i--) { + ret += numbers[i] * weight; + weight *= 10; + } + + return ret; +} + diff --git a/code/answear/advanced C/test/02/01 实现atoi/MyAtoi2.c b/code/answear/advanced C/test/02/01 实现atoi/MyAtoi2.c new file mode 100644 index 0000000..c0498a9 --- /dev/null +++ b/code/answear/advanced C/test/02/01 实现atoi/MyAtoi2.c @@ -0,0 +1,82 @@ +#define _CRT_SECURE_NO_WARNINGS 1 + +// atoi ʵֵһ汾 +// һ汾ʵͿ atoi ʵеĵطһµ +// ⺯ atoi ַ "abc123", صĽ 0 һʵֵ MyAtoi ᷵ 123 +// "+-123", صĽ 0 MyAtoi ᷵ -123 +// ʵҾҶ atoi ǿ +// ҲӦù淶һ㣬Ͼǿ⺯ + +#include +#include +#include + +int MyAtoi_2(const char* str) { + + int flg = 1; + int ret = 0; + + if (str == NULL || str == '\0') { + return 0; + } + + // жǷΪհַո񣬻УƱҳ ... + while (isspace(*str)) { + str++; + } + + // жǷΪ + // ÿ⺯ atoi һ¾֪ "+-123" ַ޷תֵģһҪ + // λһ֣򷵻 0 + if (*str == '+' || *str == '-' ) { + + if (*(str + 1) == NULL) { + return 0; + } + + if (!isdigit(*(str + 1))) { + return 0; + } + + if (*str == '-') { + flg = -1; + } + str++; + } + + // ַ + while (*str != '\0') { + if (isdigit(*str)) { + + // жһ»᲻ᳬ int ķΧ + if (((unsigned long)ret * 10 + (*str - '0')) > INT_MAX) { + return INT_MAX; + } + ret = ret * 10 + (*str - '0'); + + // MyAtoi Уѡ洢ÿһλȻӺǰγÿһλȨ + // ֱӼһ֮ǰȳ 10 Ϊ + } + else { + return 0; + } + str++; + } + + return ret * flg; +} + +int main(void) { + + char str[100]; + int ret; + + scanf("%s", str); + + ret = MyAtoi_2(str); + + printf("%d\n", ret); + + return 0; +} + diff --git a/code/answear/advanced C/test/02/02 strncpy & strncat/MyStrncat.c b/code/answear/advanced C/test/02/02 strncpy & strncat/MyStrncat.c new file mode 100644 index 0000000..77b679b --- /dev/null +++ b/code/answear/advanced C/test/02/02 strncpy & strncat/MyStrncat.c @@ -0,0 +1,70 @@ +#define _CRT_SECURE_NO_WARNINGS 1 + +// strncat ʵ + +#include +#include + +char* MyStrncat(char* dest, const char* src, int count); + +int main(void) { + + char dest[100]; + char src[50]; + int count = 0; + + printf("Enter string dest: "); + scanf("%s", dest); + printf("Enter string src: "); + scanf("%s", src); + printf("Enter number of character(s) copy from src to dest: "); + scanf("%d", &count); + + MyStrncat(dest, src, count); + + printf("%s\n", dest); + + return 0; +} + +// ʵҾȡʵֳ粻ддһ鶼һƬһƬģ +// էһоǶԵģԼһ룬ǺΣյдҲԹ +// CԱ﷨ãʵǵˮƷûˣ벻õд +// Ǹûѧ Cĺ C ĴʼдİƺΪһЩӿڡ + +// ˵һдʲô©ȣǿһ cppreference ϸĶ壺 + +// src ַָ count ַ dest ָĿַֹֽĩβ +//ҵַַֹͣ src[0] 滻λ dest ĩβĿֹ +//ʼպַֹĩβʺдֽ count + 1 + +//Ŀûж dest src count ַַֹ㹻ռ䣬 +//Ϊδ塣ԴĿصΪδ塣 dest ַָָֹֽ룬 +// src ַָָ룬Ϊδ塣 + +// ˵һΪܴڵ: +// 1.dest count ַǷԽ磿 +// 2.dest û '\0' ûм⡣ûУпԽ磬ҽɷǷڴʺ͸д +// 3. src û '\0' count ִ srcַݵĴС srcַ鱾ĴС +// ʱҲɷǷڴʡ +// 4.src Dzַָָ룿 + +// ⻶ӭ䣬иõĽⷨCԣӭңһ֪Ƽ˽Ҽɣ + +char* MyStrncat(char* dest, const char* src, int count) { + + assert(dest && src); + + char* NewStr = dest; + + // ѭ NewStr ָ dest ַ '\0' λ + while (*NewStr != '\0') { + ++NewStr; + } + while (count-- && (*NewStr++ = *src++)); + + *NewStr = '\0'; + + return dest; +} + diff --git a/code/answear/advanced C/test/02/02 strncpy & strncat/MyStrncpy.c b/code/answear/advanced C/test/02/02 strncpy & strncat/MyStrncpy.c new file mode 100644 index 0000000..720018e --- /dev/null +++ b/code/answear/advanced C/test/02/02 strncpy & strncat/MyStrncpy.c @@ -0,0 +1,52 @@ +#define _CRT_SECURE_NO_WARNINGS 1 + +#include +#include + +char* MyStrncpy(char* dest, char* src, int count); + +int main(void) { + + char dest[100]; + char src[50]; + int count = 0; + + printf("Enter string dest: "); + scanf("%s", dest); + printf("Enter string src: "); + scanf("%s", src); + printf("Enter number of character(s) copy from src to dest: "); + scanf("%d", &count); + + MyStrncpy(dest, src, count); + + printf("%s\n", dest); + + return 0; +} + +// ͬǿDzȫģ +// 1. count ַdest ô죿 +// 2. count src src ûпַô죿 + +char* MyStrncpy(char* dest,const char* src, int count) { + + assert(dest && src); + char* begin = dest; + + while (count-- && (*begin++ = *src++)); + + // count С src ijȣôõַDzַġ + // \0 DZյġ + if (count + 1 == 0) { + *begin = '\0'; + } + else { + while (count--) { + *begin++ = *src++; + } + } + + return dest; +} + diff --git a/code/answear/advanced C/test/02/03 单身狗问题/SingleDog.c b/code/answear/advanced C/test/02/03 单身狗问题/SingleDog.c new file mode 100644 index 0000000..ef15e7a --- /dev/null +++ b/code/answear/advanced C/test/02/03 单身狗问题/SingleDog.c @@ -0,0 +1,77 @@ +#define _CRT_SECURE_NO_WARNINGS 1 + +// ҵ⣺ +// 1. һ飬ֻһԪֻһΣԪضΣҳԪء +// 2. ԪֻһΣΣҳԪء + +// ⶼӦõ˰λ +// ͬλΪ +// ǰ ƽֵ λ ͬλ ʾ + + +#include + +int FindOneSingleDog(int arr[], int size) { + + int Dog = arr[0]; + + for (int i = 1; i < size; i++) { + Dog = Dog ^ arr[i]; + } + + return Dog; +} + +void FindTwoSingleDog(int arr[], int size, int* Dog1, int* Dog2) { + + int rst = arr[0]; + int leftPos = 0; + + for (int i = 1; i < size; i++) { + rst = rst ^ arr[i]; + } + //ʱ rst ȼ Dog1 ^ Dog2, ıλһһ 1 + + // ҵһ 1 ıλ + for (leftPos = 0; leftPos < 32; leftPos++) { + if ((rst & (1 << leftPos)) == 1) { + break; + } + } + + // Ԫطֳ֣һ leftPos λΪ 1һֲΪ 1 + // ô Dog1 Dog2 ڲͬˡٴΰλ򣬽 Dog1 Dog2 ֵ + + *Dog1 = 0; + *Dog2 = 0; + + for (int i = 0; i < size; i++) { + // leftPos Ϊ 1 + if ((arr[i] & (1 << leftPos)) == 1) { + *Dog1 = *Dog1 ^ arr[i]; + } + else { + *Dog2 = *Dog2 ^ arr[i]; + } + } + + +} + +int main(void) { + + int arr1[] = { 1, 2, 3, 4, 1, 2, 3 }; + int size1 = sizeof(arr1) / sizeof(arr1[0]); + int Dog; + + int arr2[] = { 1, 1, 2, 2, 3, 4 }; + int size2 = sizeof(arr2) / sizeof(arr2[0]); + int Dog1, Dog2; + + Dog = FindOneSingleDog(arr1, size1); + + FindTwoSingleDog(arr2, size2, &Dog1, &Dog2); + + return 0; +} + diff --git a/code/answear/advanced C/test/02/04 两数平均值/main.c b/code/answear/advanced C/test/02/04 两数平均值/main.c new file mode 100644 index 0000000..4761def --- /dev/null +++ b/code/answear/advanced C/test/02/04 两数平均值/main.c @@ -0,0 +1,51 @@ +#define _CRT_SECURE_NO_WARNINGS 1 + +// εʱһʦ ƽ󷨣һʱ֮Ҿ޴֣ʵ֮ǰʦ˵ˡ +// Ȼȷʵһֿרҵ˵רҵȵ⣬Ǵʦ֮¸Ҳȥ㲼 +// ϰǿļ䣬ܻܿĽⷨҲ̫΢ˣҶĿ + //ԣʱ򣬽ʦ޷Ϊżרҵ + +// ģûҲģ˰ԣҾдһ + +#include + +int main(void) { + + int a = 10; + int b = 11; + double aver; + int Aver; + + // 1ֱͳ2 ַǣ a + b ᳬ int ܱʾķΧǽͲҪ + + + + // 2 + + // ȷĴС + int max = a > b ? a : b; + int min = a < b ? a : b; + + // ƽֵڣ - һ С + һ + aver = max - (max - min) / 2.0; + + // ȽϽӲǣƽֵҪøʾȻܻɥʧ + printf("%.2f\n", aver); + + + + // 3˵żĵطˣλȷʵЧDZȽϸߵġ + + Aver = (a & b) + ((a ^ b) >> 1); + printf("%d\n", Aver); + + // a & b õ ab ͬλʾ + // 2 2 ͬǵƽֵ 2 + // a ^ b ʾ a bõ ab ͬλĺͱʾ 2ⲿƽֵ + // ʵ˼ͦ 2 ˼룬ͽΪ֣ 2 Ƶʽм㡣 + // λȡҪƽֵС֣ҲͽӲ + // οͣhttps://blog.csdn.net/weixin_43214609/article/details/83547313?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task + + return 0; +} + diff --git a/code/answear/advanced C/test/02/05 字符串左旋问题/StringLeftRotate.c b/code/answear/advanced C/test/02/05 字符串左旋问题/StringLeftRotate.c new file mode 100644 index 0000000..d9019c3 --- /dev/null +++ b/code/answear/advanced C/test/02/05 字符串左旋问题/StringLeftRotate.c @@ -0,0 +1,85 @@ +#define _CRT_SECURE_NO_WARNINGS 1 + +// ַ㣺 +// 1. ַ +// 2. жַǷһַõ +// һ⡣ + +#include +#include + +// ַǿʵһһַȻһȥʵתַ + +void LeftRotateOne(char str[], int size) { + + char tmp; + int i; + + if (str == NULL) + return; + + if (size == 1) + return; + + // ȱַһԪ + tmp = str[0]; + + // ַӵڶԪؿʼǰƶһλ + for (i = 1; i < size; i++) { + str[i - 1] = str[i]; + } + + str[size - 1] = tmp; + +} + +// 㷨 size ȽϴЧǺܵ͵ģΪÿƶӶȶ O(n) +void LeftRotateN(char str[], int size, int n) { + + if (str == NULL) + return; + + // ģΪ ABCD 4 û + for (int i = 0; i < n % size; i++) { + LeftRotateOne(str, size); + } +} +// ж str1 str2 ǷΪ +int LeftRotateCmp(char str1[], char str2[]) { + + int len1 = strlen(str1); + int len2 = strlen(str2); + + if (str1 == NULL || str2 == NULL) + return -1; + + if (len1 != len2) + return 0; + + // str1 for ѭ len1 Σÿ str2 Ƚ + // ʵֻѭ len1 - 1 μɣ д i < len1 - 1 + // תĽᱻȽϣҼʹתһΣ൱жϽ str1 λˣһã + for (int i = 0; i < len1; i++) { + if (strcmp(str1, str2) == 0) { + return 1; + } + LeftRotateOne(str1, len1); + } + + return 0; +} + +int main(void) { + + char str[] = "ABCD"; + char str1[] = "DABC"; + + //LeftRotateOne(str, strlen(str)); + //LeftRotateN(str, strlen(str), 4); + int a = LeftRotateCmp(str, str1); + + printf("%d", a); + + return 0; +} + diff --git a/code/answear/advanced C/test/02/05 字符串左旋问题/readme.md b/code/answear/advanced C/test/02/05 字符串左旋问题/readme.md new file mode 100644 index 0000000..1e04909 --- /dev/null +++ b/code/answear/advanced C/test/02/05 字符串左旋问题/readme.md @@ -0,0 +1,3 @@ +## 字符串左旋 + +这个问题我们在【习题一】也就是 上一级 【01】目录中讨论过,此次给出另一个中解法 \ No newline at end of file