Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2538892
  • 博文数量: 308
  • 博客积分: 5547
  • 博客等级: 大校
  • 技术积分: 3782
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 09:47
个人简介

hello world.

文章分类

全部博文(308)

分类: C/C++

2010-08-16 16:50:52

    有n个整数,使前面各数顺序向后移动m个位置,最后m个数编成最前面的m个数。写一函数实现以上功能,在主函数输入n个整数和输出调整后的n个数。
    这道题的意思是如有5个数:1 2 3 4 5,我们移动最后2个数,则我们应该输出的结果为: 4 5 1 2 3;我们可以从中发现需要把每个数向后移动一位,则移动两次即可达到我们想要的效果。我们进行第一次移动的时候需要把最后一个数保存在一个临时变量中最后把这个数放在第0个位置上。则进行第一次移动的结果为:5 1 2 3 4;然后再进行一次向后移动即可达到效果:4 5 1 2 3;因为我们需要数据都向后移动,因此我们可以设置一个指向末尾的指针,将前一位的数移动一位,直到arr[1]的位置,即arr[1] = arr[0]则停止移动。然后进行递归操作即可完成。代码如下:
 

#include <stdio.h>
#define N 30

void input_data(int * ,int);
void operate_data(int *,int,int);
void output_data(int * ,int);
int main(int argc, char *argv[])
{
    int n,m,arr[N];
    int *p =arr;
    printf("how many numbers?");
    scanf("%d",&n);
    printf("please input %d number\n",n);
    input_data(p,n);
    printf("how many place you want move?");
    scanf("%d",&m);
    printf("the source number is:\n");
    p = arr;
    output_data(p,n);
    
    p = arr;
    operate_data(p,n,m);
    printf("the result is :\n");
    p = arr;
    output_data(p,n);
    
    system("pause");
    return 0;
}

void input_data(int *arr , int n)
{
     int i;
     for (i = 0 ; i < n ; i++)
     {
         scanf("%d" , arr++);
     }
}

void operate_data(int *arr , int n ,int m)
{
     int *arr_end,*p;
     int temp;
     arr_end = arr + n - 1;
     temp = *arr_end;
     for (p = arr_end;p > arr;p--)
     {
         *p = *(p - 1);
     }
     *p = temp;
     m --;
     if (m > 0)
     {
        operate_data(arr,n,m);
     }
         
}

void output_data(int *arr , int n)
{
     int i;
     for (i = 0 ; i < n ; i++)
     {
         printf("%d ",*arr++);
     }
     printf("\n");
}


阅读(892) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~