習題8-3 陣列迴圈右移 及 練習7-8 方陣迴圈右移
陣列迴圈右移
本題要求實現一個對陣列進行迴圈右移的簡單函式:一個陣列a中存有n(>0)個整數,將每個整數迴圈向右移m(≥0)個位置,即將a中的資料由(a0a1⋯an−1)變換為(an−m⋯an−1a0a1⋯an−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;
}
邏輯至少清晰了。。
相關文章
- [PAT B] 1008 陣列元素迴圈右移問題陣列
- 1008 陣列元素迴圈右移問題 (20分)陣列
- 1008 陣列元素迴圈右移問題 (20 分)java陣列Java
- PAT1008 陣列元素迴圈右移問題(java實現)陣列Java
- PAT-B 1008 陣列元素迴圈右移問題【簡單模擬】陣列
- 陣列迴圈陣列
- O1空間複雜度實現陣列迴圈右移_LeetCode189複雜度陣列LeetCode
- for..in 迴圈陣列需注意陣列
- 大資料之JAVA基礎(五):迴圈和陣列方法練習大資料Java陣列
- while迴圈和do迴圈、緩衝區、一維陣列While陣列
- js陣列迴圈方法對比JS陣列
- 陣列常見的遍歷迴圈方法、陣列的迴圈遍歷的效率對比陣列
- Python學習-while迴圈練習PythonWhile
- 靜態佇列,迴圈陣列實現佇列陣列
- 在迴圈陣列時使用splice()方法刪除陣列遇到的問題陣列
- 加更—迴圈語句的練習題
- 手擼MQ訊息佇列——迴圈陣列MQ佇列陣列
- 457. 環形陣列是否存在迴圈陣列
- Go_ if else語句 ,,迴圈,,switch,,陣列Go陣列
- 迴圈高階綜合練習
- python基礎 while迴圈練習PythonWhile
- php 迴圈陣列引用傳值改變陣列本身的值PHP陣列
- python 基礎習題6--for迴圈和while迴圈PythonWhile
- for迴圈無法刪除陣列所有指定元素陣列
- 資料結構——迴圈佇列PTA習題資料結構佇列
- day3 分之和迴圈練習
- 直播系統原始碼,雲朵左右移動迴圈動畫實現原始碼動畫
- ASP.NET Razor – VB 迴圈和陣列簡介ASP.NET陣列
- Go 處理大陣列:使用 for range 還是 for 迴圈?Go陣列
- 迴圈陣列最大欄位和(51Nod-1050)陣列
- 學習Rust 迴圈Rust
- 1_使用swiper陣列物件迴圈圖片遇到的問題陣列物件
- ES6語法學習筆記之陣列的各種迴圈方法筆記陣列
- ASP.NET Razor – C# 迴圈和陣列簡介ASP.NETC#陣列
- JS陣列迴圈的效能和效率分析(for、while、forEach、map、for of)JS陣列While
- MYSQL儲存過程-練習3 repeat迴圈MySql儲存過程
- MYSQL儲存過程-練習4 loop迴圈MySql儲存過程OOP
- C語言-for迴圈之窮舉法練習C語言