//2021.6.24
int JosephusProblem(int n) //题一
{
assert(n <=1);
int* arr = (int*)malloc(sizeof(int));
assert(arr != nullptr);
for(int i = 0;i < n;i++)
{
arr[i] = 1;
}
int count = 0;
int sum = n;
while (sum > 1)//存活人数大于一 继续叫号退出
{
for (int i = 0;i < n;i++)
{
if (arr[i] = 1) //存活人数叫号 退出者不用叫号
{
count++;
if (count == 3)
{
count = 0; //退出后重新叫号
sum--; //存活人数减一
arr[i] = 0; //退出
}
}
}
}
for (int i = 0;i < n;i++) //遍历一遍数组 找到唯一存活者的下标
{
if (arr[i] == 1)
{
free(arr);
return i;
}
}
free(arr);
return -1;
}
void StrCut(char* des, const char* src, int m) //题二
{
assert(des != nullptr && src != nullptr);
if (des == nullptr || src == nullptr)
{
return;
}
int n = strlen(src);
assert(m > 0 && m < n);
if (m <= 0 || m >= n)
{
*des = '\0'; //若出错第一个字符将改为\0 并非必须加
return;
}
m--; //m如果传的是5 则从位置下标4的地方开始拷贝
int i = 0; //目标字符串des的开始下标
while (m <= n)
{
des[i++] = src[m++];
}
}
void StrSort(char* arr[10], int len) //题三
{
assert( arr != nullptr);
int min = 0;
for (int i = 0;i < len-1;i++) //趟数 = 总体个数 - 1
{
min = i;
for (int j = i + 1;j < len;j++)
{
if (strcmp(arr[min], arr[j]) > 0)
{
min = j;
}
}
if (min != i) //如果min不再指向待排序队列的第一个空间
{
char* tmp = arr[min];
arr[min] = arr[i];
arr[i] = tmp;
}
}
}
int GetNumCount(const char* str)//判断字符串中存在几个整数 //题四
{
int count = 0;
while (*str != '\0')
{
if (isdigit(*str) && !isdigit(*(str + 1)))
{
count++;
}
str++;
}
return count;
}
int* GetNumArrFromStr(const char* str, int* len)
{
//assert
*len = GetNumCount(str);//n 已经将str中整数的个数获取了
int* arr = (int*)malloc(sizeof(int) * (*len));
//assert
int sum = 0;
int i = 0;//数组arr的下标 从0开始
while (*str != '\0')
{
while (isdigit(*str))//判断当前字符是否是一个数字
{
sum = sum * 10 + *str - '0';//将数字字符转换成数字并入到sum里
str++;
}
if (sum != 0)//判断sum的值不为0 如果不为0 sum存放的才是有效值
{
arr[i] = sum;
i++;
sum = 0;
}
if (*str != '\0')//排除特殊情况, 最后一个字符是数字字符
{
str++;
}
}
return arr;
}
int main() //题一二三四主函数
{
printf("幸存人的位置为%d\n", JosephusProblem(41));
printf("幸存人的位置为%d\n", JosephusProblem(5));
char str1[100];
const char* str2 = "abcdefghi";
StrCut(str1, str2, 3);
printf("%s\n", str1);
char* str3[10] = { "China", "Japan", "America",
"Singapore", "England", "Canada",
"Russia", "France", "Germany",
"Egypt" };
StrSort(str3, 10);
for (int i = 0; i < 10; i++)
{
printf("%s ", str3[i]);
}
printf("\n");
int len = 0;
const char* str4 = "A123x456 17960? 302tab5876";
int* brr = GetNumArrFromStr(str4, &len);
printf("str4有%d个整数", len);
for (int i = 0; i < len; i++)
{
printf("%d ", brr[i]);
}
printf("\n");
return 0;
}
//2021.6.17 (6.6上机题讲解)
void Vowel(char* des, const char* src) //题一
{
assert(des != nullptr || src != nullptr);
if (des == nullptr || src == nullptr)
return;
char* vowel = "aeiouAEIOU";
int j = 0;
while (*src != '\0')
{
for (int i = 0;i < 10;i++)
{
if (*src == vowel[i])
{
des[j++] = *src;
break;
}
}
src++;
}
des[j] = '\0';
}
char* MaxWords(const char* str) //题二
{
assert(str != nullptr);
int len = strlen(str);
char* curword = (char*)malloc(sizeof(char) * (len + 1));
char* maxword = (char*)malloc(sizeof(char) * (len + 1));
assert(curword != nullptr || maxword != nullptr);
int cur = 0;
int max = 0;
while (*str != '\0')
{
if (isalpha(*str))
{
curword[cur++] = *str;
}
else
{
if (cur > max)
{
curword[cur] = '\0';
strcpy_s(maxword, cur + 1, curword);
max = cur;
cur = 0;
}
}
str++;
}
if (cur > max)
{
curword[cur] = '\0';
strcpy_s(maxword, cur + 1, curword);
}
free(curword);
return maxword;
}
void BubbleSort(int arr[], int len) //题三(冒泡排序)
{
assert(arr != nullptr);
for (int i = 0;i < len - 1;i++) //循环次数 记住减一次
{
for (int j = 0;j + 1 < len - i;j++) //从头开始 j+1得合法 每次少判断一个
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int Lengeder(int n, int x) //题四
{
assert(n < 0);
if (n == 0)
{
return 1;
}
else if (n == 1)
{
return x;
}
else
{
return ((2 * n - 1) * x - Lengeder(n - 1, x) - (n - 1) * Lengeder(n - 2, x)) / n;
}
}
void Move(int arr[], int n, int m) //题五
{
assert(n != 0);
int* brr = (int*)malloc(sizeof(int) * m);
assert(brr != nullptr);
for (int i = 0;i < m;i++) //把后m个拷贝出来
{
brr[i] = arr[n - m + i];
}
for (int i = n - m - 1;i >= 0;i--) //把前面的向后挪动,把前面的空间空出来
{
arr[i + m] = arr[i];
}
for (int i = 0;i < m;i++) //往空出来的空间里放值
{
arr[i] = brr[i];
}
}