天天看點

有n個整數,将最後m個數前移,最終輸出新的數組

數組中移動多個數的位置,重新輸出

(1)題目描述

有n個整數,使前面各數順序向後移動m個位置,最後m個數變成最前面的m個數,寫一函數實作以上功能,在主函數中輸入n個整數和輸出調整後的n個數。

有n個整數,将最後m個數前移,最終輸出新的數組

(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; 
}
           

小白作者解釋:以上的解題思路比較淩亂,僅供參考,但是代碼沒有問題,若有大神有高見,可以在下面留言指點

繼續閱讀