首页 > 用户发贴区 > 编程问题提问区 > 函数递归调用
2008
08-29

书上习题10.4


有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。写一函数实现以上功能,主函数中输入n个整数和输出调整后的n个数。


#include <stdio.h>
void move(int *p,int n,int m);
void main()
{
  int n,m,i;
  int num[20];
  printf(“how many numbers \n”);
  scanf(“%d”,&n);
  printf(“input %d numbers\n”,n);
  for(i=0;i<n;i++)
     scanf(“%d”,&num[i]);
  printf(“numbers want to move:\n”);
  scanf(“%d”,&m);
  move(num,n,m);
  printf(“now \n”);
  for(i=0;i<n;i++)
     printf(“%d “,num[i]);
}


void move(int *p,int n,int m)
{
 int *w,array_end;
 array_end=*(p+n-1);
 for(w=p+n-1;w>p;w–)
 {
  *w=*(w-1);
 }
 *w=array_end;
 m–;
 if(m>0)
  move(p,n,m);


}


函数递归调用》有 4 条评论

  1. bowen 说:

    学习了,好象不完整呀。

     

     

  2. mhjerry 说:

    编译不过?

  3. xcgang 说:

    这个函数的好处是只移动尽量少的次数,每次都移动应该移到的

    位置,而且只设置一个空位(tmp)

    void move (int a[],int n, int m) /*m <=n */

    {

       int r,k ;

       int count=0 , t=0,tmp;

       while (count<n)

       {

          r= t ;  // r is blank position;

          tmp = a[r] ; // a[r]–>tmp

          while (1)

          {

             k = (n-m+r) %n ;

             if (k==t)

                break ;

             a[r] = a[k] ; // r+m –>r ,

             count++;

             r = k ;

          }

          a[r] = tmp ;

          count++;

          t++;

       }

    }

    #define N 20

    main()

    {

       int a[N];

       int n,m ,i;

       while (1)

       {

          printf(“enter the array of line is: < %d \n”,N);

          scanf(“%d”,&n);

          printf(“\n”);

          printf(“enter each item of array (total %d):\n”,n );

          for(i=0;i<n;i++)

          {

             scanf(“%d”,&a[i]);

          }

          

          printf(“enter the numbers will be moved: < %d \n”,n);

          scanf(“%d”,&m);

          move(a,n,m);

          for(i=0;i<n;i++)

             printf(“%3d”,a[i]);

          printf(“\n”);

       }

       return 0 ;

    }

  4. frisa 说:

    void move(int *p,int n,int m)
    {
     int *w,array_end;
     array_end=*(p+n-1);
     for(w=p+n-1;w>p;w–)这里的p和w都是指针,怎能比大小呢
     {
      *w=*(w-1);
     }
     *w=array_end;
     m–;
     if(m>0)
      move(p,n,m);

    }

    只要将for循环的条件改成for(w=p+n-1,i=0;i<n-1;w–,i++)就可以了

留下一个回复