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 展开
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 展开
展开全部
#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");
}
本来还有一个递归的方案 不过写起来太复杂 不好理解 参数太多
展开全部
#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;
}
追问
大神,能简单讲一下思路吗?
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
算法:
(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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询