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

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com