習題8-3 陣列迴圈右移 及 練習7-8 方陣迴圈右移

Allen_935發表於2020-11-25

陣列迴圈右移

 

本題要求實現一個對陣列進行迴圈右移的簡單函式:一個陣列a中存有n(>0)個整數,將每個整數迴圈向右移m(≥0)個位置,即將a中的資料由(a​0​​a​1​​⋯a​n−1​​)變換為(a​n−m​​⋯a​n−1​​a​0​​a​1​​⋯a​n−m−1​​)(最後m個數迴圈移至最前面的m個位置)。

函式介面定義:

int ArrayShift( int a[], int n, int m );

其中a[]是使用者傳入的陣列;n是陣列的大小;m是右移的位數。函式ArrayShift須將迴圈右移後的陣列仍然存在a[]中。

裁判測試程式樣例:

#include <stdio.h>
#define MAXN 10

int ArrayShift( int a[], int n, int m );

int main()
{
    int a[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);

    ArrayShift(a, n, m);

    for ( i = 0; i < n; i++ ) {
        if (i != 0) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");

    return 0;
}

/* 你的程式碼將被嵌在這裡 */

輸入樣例:

6 2
1 2 3 4 5 6

輸出樣例:

5 6 1 2 3 4

 

 

程式碼:

#define MAXN 10
int ArrayShift(int a[], int n, int m);

int main()
{
	int a[MAXN], n, m;
	int i;

	scanf("%d %d", &n, &m);
	for (i = 0; i < n; i++) scanf("%d", &a[i]);

	ArrayShift(a, n, m);

	for (i = 0; i < n; i++) {
		if (i != 0) printf(" ");
		printf("%d", a[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}

int ArrayShift(int a[], int n, int m) {
	int i, j;
	m = m % n;								//移動n個回覆原位 
	int temp[100];							//定義temp[] 用他去操作重寫的過程
	for (j = 0; j < n; j++) {				//遍歷賦值temp[]
		temp[j] = a[j];
	}
	for (i = 0; i < n; i++) {
		if (i >= (n - m)) {					//類似於一個連線字串的操作
			a[i + m - n] = temp[i];			//從尾部再重返頭部
		}
		else {								//正常情況下 不涉及越界
			a[i + m] = temp[i];
		}
	}
}

要學會m=m%n;這個思想

重寫字串思想,即新定義一個字串,用老字串賦值後去操作老字串。

以及如何判斷元素是否需要從尾部到頭部的轉移。

 

類似題目:練習7-8 方陣迴圈右移

本題要求編寫程式,將給定n×n方陣中的每個元素迴圈向右移m個位置,即將第0、1、⋯、n−1列變換為第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。

輸入格式:

輸入第一行給出兩個正整數m和n(1≤n≤6)。接下來一共n行,每行n個整數,表示一個n階的方陣。

輸出格式:

按照輸入格式輸出移動後的方陣:即輸出n行,每行n個整數,每個整數後輸出一個空格。

輸入樣例:

2 3
1 2 3
4 5 6
7 8 9

輸出樣例:

2 3 1 
5 6 4 
8 9 7 

 

之前寫的破爛:

#include<stdio.h>
int main()
{
	int a[7][7];
	int m, n, k, s, i, j, u, p;						//定義了8個變數 還每個都有用就牛逼
	scanf("%d %d", &m, &n);
	p = 1;											//立個flag
	if (m > n&&m%n != 0) {							//如果m整除了
		u = m % n;									//需要這個操作好像是因為後面的操作是讓元素左移而不是右移
		m = n - u;
		p = 2;										//立flag
	}
	for (i = 0; i < n; i++) {						//讀矩陣
		for (j = 0; j < n; j++) {
			scanf("%d", &a[i][j]);
		}
	}
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			s = j;
			for (k = 0; k < m&&m%n != 0; k++) {
				if (p == 1) {						//看不懂了不想看了
					s = j;
				}
				if (s == n - 1) {
					s = s - n + 1;
				}
				else {
					s++;
				}
			}
			printf("%d ", a[i][s]);					//一行一行移 移完一行就printf
		}
		printf("\n");
	}
	system("pause");
	return 0;
}

 

也不知道當時怎麼寫的。。也是過了。。

 

 

重新寫的:

#include<stdio.h>
int main()
{
	int a[7][7];
	int m, n;
	scanf("%d %d", &m, &n);
	int i, j;
	//讀矩陣
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			scanf("%d", &a[i][j]);
		}
	}
	//再定義一個矩陣並賦值
	int b[7][7];
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			b[i][j] = a[i][j];
		}
	}
	//重寫
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			m = m % n;
			if (j >= (n - m)) {
				a[i][j + m - n] = b[i][j];
			}
			else {
				a[i][j + m] = b[i][j];
			}
		}
	}

    //輸出
	int cnt = 0;
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			printf("%d ", a[i][j]);
			cnt++;
			if (cnt == n) {
				cnt = 0;
				printf("\n");
			}
		}
	}
	
	system("pause");
	return 0;
}

 

邏輯至少清晰了。。

 

相關文章