一、约瑟夫环
有n个人围成一圈,报3的退出,问剩下的一个人的编号是多少?
int Circle(int n)//约瑟夫环
{
int *arr = (int *)malloc(n*sizeof(int));
int i;
for(i=0;i<n;i++)
{
arr[i] = 1;
}
int count = n; //存活的人数
int times = 0;//报的数字
i = 0;
{
int *arr = (int *)malloc(n*sizeof(int));
int i;
for(i=0;i<n;i++)
{
arr[i] = 1;
}
int count = n; //存活的人数
int times = 0;//报的数字
i = 0;
while(count > 1)
{
if(arr[i] != 0)
{
times++;
if(times == 3)
{
arr[i] = 0;
times = 0;
count--;
}
}
//i++;//error
/*i++;//1
if(i == n)
{
i = 0;
}*/
//i = (i==n-1 ? 0 : i+1);//2
i = (i+1)%n;//3
}
{
if(arr[i] != 0)
{
times++;
if(times == 3)
{
arr[i] = 0;
times = 0;
count--;
}
}
//i++;//error
/*i++;//1
if(i == n)
{
i = 0;
}*/
//i = (i==n-1 ? 0 : i+1);//2
i = (i+1)%n;//3
}
for(i=0;i<n;i++)
{
if(arr[i] != 0)
{
break;
}
}
{
if(arr[i] != 0)
{
break;
}
}
free(arr);
return i+1;
}
return i+1;
}
二、内存重叠
1.字符串排序
void BubbleSort(int *arr,int len) //冒泡排序
{
int tmp;
for(int i=0;i<len-1;i++)
{
for(int j=0;j<len-1-i;j++)
{
if(arr[j] > arr[j+1])
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
{
int tmp;
for(int i=0;i<len-1;i++)
{
for(int j=0;j<len-1-i;j++)
{
if(arr[j] > arr[j+1])
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
void StrSort(char **arr,int len)//字符串的冒泡排序
{
//char **arr保存char *,所以定义一个char *tmp,tmp中保存的是字符串的值
char *tmp;
for(int i=0;i<len-1;i++)
{
for(int j=0;j<len-1-i;j++)
{
if(strcmp(arr[j],arr[j+1]) > 0)
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
char *tmp;
for(int i=0;i<len-1;i++)
{
for(int j=0;j<len-1-i;j++)
{
if(strcmp(arr[j],arr[j+1]) > 0)
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
void Show() //打印函数
{
int i = 0;
int j = 0;
char *str[10] = {"China","Japan","America",
"Korea","England","Germany",
"France","Russia","Singapore",
"Malaysia"};
int len = sizeof(str)/sizeof(str[0]);
StrSort(str,len);
for(i = 0;i<len;i++)
{
printf("%s\n",str[i]);
}
}
{
int i = 0;
int j = 0;
char *str[10] = {"China","Japan","America",
"Korea","England","Germany",
"France","Russia","Singapore",
"Malaysia"};
int len = sizeof(str)/sizeof(str[0]);
StrSort(str,len);
for(i = 0;i<len;i++)
{
printf("%s\n",str[i]);
}
}
int main()
{
Show();
return 0;
}
{
Show();
return 0;
}
2.//从src拷贝到des,len是需要拷贝的数据个数
#include<stdio.h>
void Move1(int *des,int *src,int len)//百度的笔试题
{
for(int i=0;i<len;i++)
{
des[i] = src[i];
}
}
#include<stdio.h>
void Move1(int *des,int *src,int len)//百度的笔试题
{
for(int i=0;i<len;i++)
{
des[i] = src[i];
}
}
void Show(int *arr,int len)
{
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
//(1)从一个数组拷贝到另一个数组
/*int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int brr[10];
Move1(brr,arr,10);
Show(arr,sizeof(arr)/sizeof(arr[0]));
Show(brr,sizeof(brr)/sizeof(brr[0])); */
{
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
//(1)从一个数组拷贝到另一个数组
/*int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int brr[10];
Move1(brr,arr,10);
Show(arr,sizeof(arr)/sizeof(arr[0]));
Show(brr,sizeof(brr)/sizeof(brr[0])); */
(2)见下
//(3)内存重叠,后面的4,5,6,7,8,9,10将前面的1,2,3,4,5,6,7覆盖了
/*int arr[10] = {1,2,3,4,5,6,7,8,9,10};
Show(arr,sizeof(arr)/sizeof(arr[0]));
Move1(&arr[0],&arr[3],7);
Show(arr,sizeof(arr)/sizeof(arr[0]));
return 0;*/
//(4)预期的结果:1,2,3,4,1,2,3,4,5,6
//实际的结果:1,2,3,4,1,2,3,4,1,2
//原因:des与src都指向一个内存,出现内存共享(即字符串常量是浅拷贝),所以在修改des时将src的值也修改了
/*int arr[10] = {1,2,3,4,5,6,7,8,9,10};
Show(arr,sizeof(arr)/sizeof(arr[0]));
Move1(&arr[4],&arr[0],6);
Show(arr,sizeof(arr)/sizeof(arr[0]));
*/
}//
//(3)内存重叠,后面的4,5,6,7,8,9,10将前面的1,2,3,4,5,6,7覆盖了
/*int arr[10] = {1,2,3,4,5,6,7,8,9,10};
Show(arr,sizeof(arr)/sizeof(arr[0]));
Move1(&arr[0],&arr[3],7);
Show(arr,sizeof(arr)/sizeof(arr[0]));
return 0;*/
//(4)预期的结果:1,2,3,4,1,2,3,4,5,6
//实际的结果:1,2,3,4,1,2,3,4,1,2
//原因:des与src都指向一个内存,出现内存共享(即字符串常量是浅拷贝),所以在修改des时将src的值也修改了
/*int arr[10] = {1,2,3,4,5,6,7,8,9,10};
Show(arr,sizeof(arr)/sizeof(arr[0]));
Move1(&arr[4],&arr[0],6);
Show(arr,sizeof(arr)/sizeof(arr[0]));
*/
}//
2.(2)将一个数组的后m个移至最前面
//n表示数组长度
//m表示需要移到的后半段的数据长度
#include<stdio.h>
#include<malloc.h>
void Move2(int *arr,int n,int m)
{
if(arr==NULL || n<=0 || m<0 || n<m)
{
return ;
}
int *p = (int *)malloc(m*sizeof(int));
int i;
//n表示数组长度
//m表示需要移到的后半段的数据长度
#include<stdio.h>
#include<malloc.h>
void Move2(int *arr,int n,int m)
{
if(arr==NULL || n<=0 || m<0 || n<m)
{
return ;
}
int *p = (int *)malloc(m*sizeof(int));
int i;
{
p[i] = arr[i];
}
for(i = m;i<n;i++)//将后面的n-m个元素移至前面
{
arr[i-m] = arr[i];
}
for(i = 0;i<m;i++)//将保存的m个元素移到后面
{
arr[i] = p[i];
}
arr[i] = p[i];
}
free(p);
}
}
void Show(int *arr,int len)
{
int i = 0;
for(i = 0;i<len;i++)
{
printf("%d",arr[i]);
}
printf("\n");
}
{
int i = 0;
for(i = 0;i<len;i++)
{
printf("%d",arr[i]);
}
printf("\n");
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
Show(arr,sizeof(arr)/sizeof(arr[0]));
Move2(arr,sizeof(arr)/sizeof(arr[0]),3);
Show(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
Show(arr,sizeof(arr)/sizeof(arr[0]));
Move2(arr,sizeof(arr)/sizeof(arr[0]),3);
Show(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}
2.(4)将前面的m个元素移到数组的最后面,即向后移n-m个格子
#include<stdio.h>
#include<malloc.h>
void Move(int *arr,int n,int m)
{
int *p = (int *)malloc(m*sizeof(int));
int i = 0;
for(i = 0;i<m;i++)//将前面的m个元素先保存起来
{
p[i] = arr[i];
}
for(i = m;i<n;i++)//将后面的n-m个元素移至前面
{
arr[i-m] = arr[i];
}
for(i = 0;i<m;i++)//将保存的m个元素移到后面
{
arr[n-m+i] = p[i];
}
free(p);
}
void Show(int *arr,int len)
{
int i = 0;
for(i = 0;i<len;i++)
{
printf("%d",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
Move(arr,10,3);
Show(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}
#include<stdio.h>
#include<malloc.h>
void Move(int *arr,int n,int m)
{
int *p = (int *)malloc(m*sizeof(int));
int i = 0;
for(i = 0;i<m;i++)//将前面的m个元素先保存起来
{
p[i] = arr[i];
}
for(i = m;i<n;i++)//将后面的n-m个元素移至前面
{
arr[i-m] = arr[i];
}
for(i = 0;i<m;i++)//将保存的m个元素移到后面
{
arr[n-m+i] = p[i];
}
free(p);
}
void Show(int *arr,int len)
{
int i = 0;
for(i = 0;i<len;i++)
{
printf("%d",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
Move(arr,10,3);
Show(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}