一道C语言题目,没看懂!

schengshuo1 2009-08-15 11:22:28
请编写函数fun(),该函数的功能是:移动一维数组中的内容,若数组中有n个整数,要求把下标从p到n-1(p≤n-1)的数组元素平移到数组的前面。
例如,一维数组中的原始内容为1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,p的值为6。移动后,一维数组中的内容应为7,8,9,10,10,11,12,13,14,15,1,2,3,4,5,6。


#include <stdio.h>
#define N 80
void fun(int *w, int p, int n)
{
int i,j,t;
for(i=p;i<=n-1;i++) /*循环右移n-p次*/
{t=w[n-1];
for(j=n-2;j>=0;j--) /*实现循环右移*/
w[j+1]=w[j];
w[0]=t;
}
}
main()
{
int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int i, p, n=15;
printf("The original data:\n");
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n\nEnter p: ");
scanf("%d",&p);
fun(a,p,n);
printf("\nThe data after moving:\n");
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n\n");
}
这道上机题要求补充函数 fun(int *w, int p, int n){} 红字就是答案,但我看了好久也没看懂!


...全文
285 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
unsv29mj 2009-08-27
  • 打赏
  • 举报
回复
要我 就用指针!!!
  • 打赏
  • 举报
回复
也就是交换位置嘛
gauss85 2009-08-22
  • 打赏
  • 举报
回复
去看《编程珠玑》第二节吧。里面对这个算法有3、4种解决方法,都绝对经典
藏羚羊 2009-08-22
  • 打赏
  • 举报
回复
这种做法效率高。

{1,2,3,4,4,5,6}
p = 4, n = 7

{1,1,2,3,4,4,5} temp = 6
{6,1,2,3,4,4,5}
{6,6,1,2,3,4,4} tmep = 5
{5,6,1,2,3,4,4}
>>>>>>>>>>>
>>>>>>>>>>>>>>>
kakashi0309 2009-08-22
  • 打赏
  • 举报
回复
来个代码量少点的


void fun(int *w, int p, int n)
{
int *v = new int[n];
memcpy(v, w+p, (n-p)*sizeof(int));
memcpy(v+n-p, w, p*sizeof(int));
memcpy(w, v, n*sizeof(int));
delete []v;
}
martin304201 2009-08-22
  • 打赏
  • 举报
回复
仅供参考:
它是这样的:例如原始数据为1,2,3,4,5,6,7,8,9;初始p=3;
它是先把9移动最前面使数组变为:9,1,2,3,4,5,6,7,8
以此循环,共循环(9-3)=6次,就得到了最后结果数组:4,5,6,7,8,9,1,2,3
kunlamp 2009-08-16
  • 打赏
  • 举报
回复
现在给你个思路,
int temp[7];//存放暂时数据
int source [15]={123.....};//存放元数据
int i;
for(i=0;i<6;i++)
{
temp[i]=source[i];
}
//提取出来要后移的数据
for(i=0;i<10;i++)
{
source[i]=source[i+6];
}
// 迁移 7-15
for(i=0;i<6;i++)
{
source[i+10] =temp[i]
}
//后移1-6
li32768 2009-08-16
  • 打赏
  • 举报
回复
呵呵,不错的思路,程序简洁
tanwan 2009-08-16
  • 打赏
  • 举报
回复
如果要方便一点的话直接把前面的数据先存到一个临时变量里然后把后面的移上来的在把临时的内容跟到后面去...要是理解上好理解的话可以这样,先移一个出来然后把2~n-1全部往前移移P次..
schengshuo1 2009-08-15
  • 打赏
  • 举报
回复
飞天御剑流
你这个算法我一看就理解了,开始我拿到这个题目时第一想法就是你这样的,但就是表达不出来,所以就看答案,答案这算法我理解起来老别扭得。现在豁然开朗了! +
liao05050075 2009-08-15
  • 打赏
  • 举报
回复
其实我觉得他这样写不是很好。让人有点费解了。因为他的想法是反过来的。
{t=w[n-1];
for(j=n-2;j>=0;j--) /*实现循环右移*/
w[j+1]=w[j];
w[0]=t;
}
这一段是把整个数组右移一位,比如1 2 3 4,变成 4 1 2 3
于是,本来左移p次,变成右移就要移n-p次了。
话说,直接写成左移的话,就又直观又好理解了。
飞天御剑流 2009-08-15
  • 打赏
  • 举报
回复
那个算法就是把最后一个元素先存起来,然后整个数组右移一次,再把存起来的那个元素放到最左边。


但是这个算法很差,做了很多无谓的移动,可以用空间换时间:


void fun(int *w, int p, int n)
{
int *q = ( int* )malloc( sizeof( int ) * n );
int i;
for( i = 0; p < n; ++p, ++i ) q[i] = w[p];
for( i = 0; i < p; ++i ) q[n-p+i] = w[i];
for( i = 0; i < n; ++i ) w[i] = q[i];
free( q );
}
starcat 2009-08-15
  • 打赏
  • 举报
回复
嗯,freshman
先把最右一个赋给临时变量t
然后把次右一个、倒数第三个依次往右搬一格,即覆盖掉原来的值
最后把左边空出来的位置赋t值
mstlq 2009-08-15
  • 打赏
  • 举报
回复
下面三行加起来是循环右移一位
t=w[n-1];            
for(j=n-2;j>=0;j--) /*实现循环右移*/
w[j+1]=w[j];
w[0]=t;
barbara2008 2009-08-15
  • 打赏
  • 举报
回复
别人的思路有时候会成为你思考的障碍
barbara2008 2009-08-15
  • 打赏
  • 举报
回复
看不懂就自己去实现,别老是想着别人的思路!

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧