C语言:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,写一个函数实现以上功能

#include<stdio.h>
int main()
{
int change(int a[100],int n,int m);
int n,m,i,a[100];
printf("请输入数组长度n");
scanf("%d",&n);
printf("请输入%d个数",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);

}
printf("需要移动的数的个数m:");
scanf("%d",&m);
change(a,n,m);
printf("新数列为:");
for(i=0;i<n;i++);
printf("%d",a[i]);
return 0;
}
int change(int a[100],int n,int m)
{
int *p,i;
for(i=0;i<m;i++)
{
p=p+n-1;
p++;
}
return 0;
}

写着写着,不知道该怎么办了,求指导。

#include<stdio.h>

int main()
{
int change(int a[100], int n, int m);
int n, m, i, a[100];
printf("请输入数组长度n");
scanf("%d", &n);
printf("请输入%d个数", n);
for (i = 0; i<n; i++)
{
scanf("%d", &a[i]);

}
printf("需要移动的数的个数m:");
scanf("%d", &m);
change(a, n, m);
printf("新数列为:");
for (i = 0; i<n; i++) // 去掉这里的分号
printf("%d ", a[i]);
return 0;
}

int change(int a[100], int n, int m)
{
int b[100], i;
// 把最后m个存放在b
for (i = 0; i < m; i++){
b[i] = a[n - m + i];
}
// 把前面n-m个往后挪m个
for (i = n-1; i >=m; i--) {
a[i] = a[i-m];
}
// 把前m个从b放回a
for (i = 0; i < m; i++){
a[i] = b[i];
}
return 0;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-05-22
你的子函数里面最后一个循环有点错误,1,for(i = n;i < n+m ; i ++)
2,你的p的指向和i同时变化,导致你每次移动两个单位,
正确的程序如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main()
{ void move(int *p,int n,int m);
int a[30];
int *p=a;
int m,n;
printf("input the n:\n");
scanf("%d",&n);
printf("input the num:\n");
for(p=a;p<a+n;)
scanf("%d",p++);
printf("input the m:\n");
scanf("%d",&m);
p=a;
move(p,n,m);
for(p=a;p<a+n;)
printf("%d",*p++);

}

void move(int *p,int n,int m)
{ int i;
for(i=n-1;i>=0;i--) //这个循环是依次往后移动m个位置
{
*(p+i+m)=*(p+i);
}

for(i=n;i<n+m;i++) //这个循环是把后面m个数移到最开始
{

*p++=*(p+n);

}

}
第2个回答  2014-05-22
int change(int a[100],int n,int m)
{
m=m%n;
int * tmp = new int[m];
memcpy((char*)tmp,(char*)(a+n-m),m*sizeof(int));//临时缓存最后m个
memmove((char*)(a+m),(char*)a,(n-m)*sizeof(int));//移动n-m个int
memcpy((char*)a,tmp,m*sizeof(int));//赋值最后的m个int
delete []tmp;
}

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网