约瑟夫环、内存重叠

来源:互联网 发布:淘宝直播广告图片 编辑:程序博客网 时间:2024/06/06 08:31

一、约瑟夫环

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

 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
 }

 for(i=0;i<n;i++)
 {
  if(arr[i] != 0)
  {
   break;
  }
 }

 free(arr);
 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;
   }
  }
 }
}


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


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 main()
{
 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];
 }
}

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])); */
(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]));
*/
}//

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;

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