C语言数组循环左移问题

本题要求实现一个对数组进行循环左移的简单函数:一个数组aa中存有nn(>0>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移mm(\ge0≥0)个位置,即将... 本题要求实现一个对数组进行循环左移的简单函数:一个数组aa中存有nn(>0>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移mm(\ge 0≥0)个位置,即将aa中的数据由(a_0 a_1 \cdots a_{n-1}a
​0
​​ a
​1
​​ ⋯a
​n−1
​​ )变换为(a_{m} \cdots a_{n-1} a_0 a_1 \cdots a_{m-1}a
​m
​​ ⋯a
​n−1
​​ a
​0
​​ a
​1
​​ ⋯a
​m−1
​​ )(最前面的mm个数循环移至最后面的mm个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:

输入第1行给出正整数nn(\le 100≤100)和整数mm(\ge 0≥0);第2行给出nn个整数,其间以空格分隔。
输出格式:

在一行中输出循环左移mm位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:

8 3
1 2 3 4 5 6 7 8
输出样例:

4 5 6 7 8 1 2 3
展开
 我来答
户哲茂5B
推荐于2017-07-01 · TA获得超过817个赞
知道小有建树答主
回答量:781
采纳率:59%
帮助的人:133万
展开全部
#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");
}

本来还有一个递归的方案  不过写起来太复杂 不好理解  参数太多

White_MouseYBZ
2017-02-21 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6595万
展开全部
#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;
}
追问
大神,能简单讲一下思路吗?
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
老冯文库
2017-06-29 · 知道合伙人软件行家
老冯文库
知道合伙人软件行家
采纳数:1139 获赞数:8734

向TA提问 私信TA
展开全部

算法:

(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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式