C语言数组循环左移问题
发布网友
发布时间:2022-04-20 06:16
我来回答
共3个回答
热心网友
时间:2023-09-18 12:38
#include <stdio.h>
void main()
{
int i,i2,k,k2,n,m,a[20],tmp,tmp2,j=0;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
a[i] = i+1;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\r\n");
/********转换开始*****************/
if(n%m==0)
{
i2 = n/m;
k2 = m;
}
else
{
i2 = n;
k2 = 1;
}
for(k=0;k<k2;k++)
{
tmp = a[k];
j = k;
for(i=0;i<i2;i++)
{
j = j+n-m;
j = j%n;
tmp2 = a[j];
a[j] = tmp;
tmp = tmp2;
}
}
/********转换结束*****************/
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\r\n");
}
本来还有一个递归的方案 不过写起来太复杂 不好理解 参数太多
热心网友
时间:2023-09-18 12:38
#include <stdio.h>
int main(void){
int i,j,t,s[100],nn,mm;
printf("Input nn & mm(int 0<nn<=100,mm>0)...\n");
if(scanf("%d%d",&nn,&mm)!=2 || nn<1 || nn>100 || mm<1){
printf("Input error, exit...\n");
return 0;
}
for(i=0;i<nn;scanf("%d",s+i++));
for(i=0;i<mm;i++){
for(t=s[0],j=1;j<nn;s[j-1]=s[j++]);
s[j-1]=t;
}
for(i=0;i<nn;printf(i<nn-1 ? "%d " : "%d\n",s[i++]));
return 0;
}
追问大神,能简单讲一下思路吗?
热心网友
时间:2023-09-18 12:39
算法:
(1)arr[0..mm-1]之间的元素逆置;
(2)arr[mm..nn-1]之间的元素逆置;
(3)arr[0..nn-1]之间的元素逆置。
C语言程序:
#include "stdio.h"
#include "malloc.h"
void main()
{
int nn, mm;
int *arr;
int i;
int temp;
scanf("%d%d", &nn, &mm);
arr = (int *)malloc(sizeof(int) * nn);
for(i=0; i<nn; i++)
{
scanf("%d", arr + i);
}
mm %= nn;
for(i=0; i<mm/2; i++)
{
temp = *(arr + i);
*(arr + i) = *(arr + mm - 1 - i);
*(arr + mm - 1 - i) = temp;
}
for(i=mm; i<(nn + mm) / 2; i++)
{
temp = *(arr + i);
*(arr + i) = *(arr + nn + mm - 1 - i);
*(arr + nn + mm - 1 - i) = temp;
}
for(i=0; i<nn/2; i++)
{
temp = *(arr + i);
*(arr + i) = *(arr + nn - 1 - i);
*(arr + nn - 1 - i) = temp;
}
printf("%d", *arr);
for(i=1; i<nn; i++)
{
printf(" %d", *(arr + i));
}
}
运行测试:
8 3
1 2 3 4 5 6 7 8
4 5 6 7 8 1 2 3