數組中移動多個數的位置,重新輸出
(1)題目描述
有n個整數,使前面各數順序向後移動m個位置,最後m個數變成最前面的m個數,寫一函數實作以上功能,在主函數中輸入n個整數和輸出調整後的n個數。
(2)樣例輸入
10 20 30 40 50 60 70 80 90 100
(3)樣例輸出
注:假設将最後面的三個放在最前面
80 90 100 10 20 30 40 50 60 70
(4)解題思路
我們可以找一個空盒子,也就是一個空的數組,将後面的三個數先放在該數組中,然後再将前面七個也放進去,這時候這個新的數組就是我們要的那種順序了,然後将這個數組依次放進原數組中,這時候将原數組再輸出就行。
就是在考慮一個問題的時候,應該把好多方面都考慮進去,比如要移動的數字個數等于原數組中數的個數,那就相當于沒有移動,就直接傳回原來的數組就行,單數如果m大于了n那就相當于把m-n個數移動了,比如我想将12個數移動到最前面,但其實隻有10個數,這時在移動的時候,先是依次将10個數從頭到尾放到那個空盒子裡,然後第11,12這兩個是不存在的,就将最後面的兩個數90,100再放進去了,最後呈現的結果就是 其實是全部都移動了,但是結果看起來隻是移動了m-n個而已。
(5)代碼
#include<stdio.h>
int* Move(int p[],int len,int m)
{
if(m>len) m=m-len; //m大于n的情況
else if(m==len) return p; //m等于n的情況
int tmp[100];
int k=0;
for(int i=len-m;i<len;i++) //m小于n的情況
{
tmp[k++]=p[i]; //儲存後m個數,放入新的數組中
for(int i=0;i<len-m;i++)
{
tmp[k++]=p[i]; //儲存前面的數,接着放入數組中
}
//tmp為移動後的目标數組
for(int i=0;i<len;i++)
{
p[i]=tmp[i]; //将已經實作順序要求的數組指派給原數組
}
return p;
}
void Show(int *p) //輸出數組
{
for(int i=0;i<10;i++)
{
printf("%d ",*(p+i));//p[i]
}
}
int main()
{
int i;
int arr[10]={10,20,30,40,50,60,70,80,90,100};
Move(arr,sizeof(arr)/sizeof(arr[0]),3);
Show(arr);
//上下是兩種基本的輸入輸出方式,都可以使用
//int arr[10]={10,20,30,40,50,60,70,80,90,100};
//Move(arr,sizeof(arr)/sizeof(arr[0]),3);
//
// for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
//{
// printf("%d ",arr[i]);
//}
return 0;
}