溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

c語(yǔ)言如何實(shí)現(xiàn)數(shù)組循環(huán)左移m位

發(fā)布時(shí)間:2022-07-22 11:44:33 來(lái)源:億速云 閱讀:195 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“c語(yǔ)言如何實(shí)現(xiàn)數(shù)組循環(huán)左移m位”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“c語(yǔ)言如何實(shí)現(xiàn)數(shù)組循環(huán)左移m位”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

c語(yǔ)言數(shù)組循環(huán)左移m位

#include<stdio.h>
//函數(shù)原型
void rightshiftleft(int *p_num,int n,int m);
void enterint(int *p_num,int n);
//主函數(shù)
void main(){
	int num[100] = {1,2,3,4,5},*p_num = num;
	int n = 5,m = 2;
	printf("Int =:");
	scanf("%d",&n);
	printf("M =:");
	scanf("%d",&m);
	//整數(shù)輸入
	enterint(p_num,n);
	//數(shù)組左移
	rightshiftleft(p_num,n,m);
	for(int i = 0; i < n; i++){
	printf("%-5d",p_num[i]);
	}

}

//整數(shù)輸入
void enterint(int *p_num,int n){
	for(;n > 0 ; n--){
	scanf("%d",p_num++);
	}
}

//循環(huán)數(shù)組左移算法
void rightshiftleft(int *p_num,int n,int m){
	//臨時(shí)變量
	int temp = 0;
	//外層循環(huán)控制需要左移的次數(shù)
	for(int k = 0;k < m ; k++){

		temp = p_num[n - m + k];
		//內(nèi)層循環(huán)控制n-m的數(shù)組元素整體右移一位
		for(int i = 0; i < n - m ; i++){
			p_num[n -m -i+ k] = p_num[n - m -1 -i +k];
		}
		p_num[k] = temp;
	}
}

數(shù)組循環(huán)左移的簡(jiǎn)單方法

本題要求實(shí)現(xiàn)一個(gè)對(duì)數(shù)組進(jìn)行循環(huán)左移的簡(jiǎn)單函數(shù):一個(gè)數(shù)組a中存有n(>0)個(gè)整數(shù),將每個(gè)整數(shù)循環(huán)向左移m(&ge;0)個(gè)位置,即將a中的數(shù)據(jù)由(a0a1&hellip;an-1)變換為(am&hellip;an-1a0a1&hellip;am-1)(最前面的m個(gè)數(shù)循環(huán)移至最后面的m個(gè)位置)。如果還需要考慮程序移動(dòng)數(shù)據(jù)的次數(shù)盡量少,要如何設(shè)計(jì)移動(dòng)的方法?

輸入格式

輸入第1行給出正整數(shù)n(&le;100)和整數(shù)m(&ge;0);第2行給出n個(gè)整數(shù),其間以空格分隔。

輸出格式

在一行中輸出循環(huán)左移m位以后的整數(shù)序列,之間用空格分隔,序列結(jié)尾不能有多余空格。

輸入樣例

8 3
1 2 3 4 5 6 7 8

輸出樣例

4 5 6 7 8 1 2 3

代碼如下:

#include<stdio.h>
int main()
{
    int n,m,i;
    scanf("%d%d",&n,&m);//獲取n和m的值
    if(m>n)
        m=m%n;//去掉多余無(wú)意義的左移次數(shù)
    int a[n];
    for(i=n-m;i<n;i++)//先從左移后的位置開(kāi)始存
        scanf("%d",&a[i]);
    for(i=0;i<n-m;i++)//再?gòu)腶[0]往后存
        scanf("%d",&a[i]);
    for(i=0;i<n;i++)//輸出數(shù)組中的各個(gè)元素
    {
        printf("%d",a[i]);
        if(i!=n-1)//這樣是為了讓結(jié)尾沒(méi)有空格
            printf(" ");
    }
    return 0;
}

然后說(shuō)一下這題的思路,題目的要求其實(shí)就是將數(shù)組左移m位,然后輸出。

那么,我們其實(shí)可以先算出a[0]移動(dòng)后的位置就是a[n-m](如輸入樣例中的8 3,左移三位后,a[0]元素的位置其實(shí)就移動(dòng)到a[5]了),所以第一個(gè)for循環(huán)輸入的是a[m-n]到a[n-1]的值,然后第二個(gè)for循環(huán)再?gòu)腶[0]接著輸入到a[m-n-1],最后再直接輸出整個(gè)數(shù)組即可。

關(guān)于m>n的情況:當(dāng)m>n的時(shí)候,我們可以發(fā)現(xiàn),其實(shí)要左移的位置就是m%n(如n=3,m=4,其實(shí)就只需要左移4%3=1次),因?yàn)?個(gè)數(shù)左移3位還是本身,所以我們只需要在前面加一個(gè)判斷,當(dāng)m>n的時(shí)候,m=m%n就可以去掉多余無(wú)意義的左移。

讀到這里,這篇“c語(yǔ)言如何實(shí)現(xiàn)數(shù)組循環(huán)左移m位”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI