求解两个C语言书上的练习题(知道的请提示一下)
问题如下: 有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面m个数。写一个函数实现以上的功能,在主函数中输入n个整数,并输出调整后的n个数
我想直接计算 数组中的每个元素 移动m位置之后 但是原来的数组位置应该如何赋值
void Move(int array[20],int n,int m)
{
int *p,array_end;
int i;
p=array;
array_end=*(array+n-1);
if(i+m>n-1)
{
*(p+i+m-n)=*(p+i);
break;
}
else
{
*(p+i+m)=*(p+i);
break;
}
}
main()
{
int number[20],n,m,i;
printf("How many number");
scanf("%d",&n);
printf("Input %d numbers:\n",n);
for(i=0;i<n;i++)
{
printf("number[%d]=",i);
scanf("%d",&number[i]);
}
printf("\n Now print the number");
for(i=0;i<n;i++)
{
printf("number[%d]=",i);
printf("%2d\t",number[i]);
}
printf("\nhow many you want to move?");
scanf("%d",&m);
Move(number,n,m);
printf("Now they are:\n");
for(i=0;i<n;i++)
{
printf("number[%d]=",i);
printf("%2d\t",number[i]);
};
}
问题二 有n个人围成一圈,顺序编号,从第一个开始报数(从1到3报数)凡是报到3的人退出圈子,问最后留下的是原来第几个的那位?
main()
{
int i,k,m,n,num[50],*p;
printf("input number of person:n=");
scanf("%d",&n);
p=num;
for(i=0;i<n;i++)
{
*(p+i)=i+1; /*以1至n为每个人编号*/
}
i=0; /*i为每次循环时的计数变量*/
k=0; /*k为按1 2 3 报数时的计数变量*/
m=0; /*退出人数*/
while(m<n-1) /*当退出人数比n-1少时(即未退出人数大于1时)执行循环体*/
{
if(*(p+i)!=0)
{
k++;
}
if(k==3)
{
*(p+i)=0; /*退出的人编号为0*/
k=0;
m++;
}
i++;
if(i==n)
{
i=0; /*报到尾后 i恢复为0*/
}
}
while(*p==0)
{
p++;
}
printf("The last one is No.%d\n",*p);
}
为什么报到尾后 i恢复为
if(i==n)
{
i=0; /*报到尾后 i恢复为0*/
}
求解更好的算法 谢谢