題目描述
本文c語言**是按照visual studio 2019的標準來寫的,提交時需要將scanf_s改為scanf,並注釋掉system(「pause」)語句
分析
設定乙個陣列,長度為100
題目要求不能使用額外的陣列,只能使用乙個陣列,因此需要考慮陣列內元素的整體移動
由於採用一般的移動方式會使得需要從後移至前面的陣列元素順序逆序,因此需要設定乙個flag,具體作用為:
由於移動的部分需要按原有順序移到前面m個位置,所以設定乙個flag,第一次移動時值為0,之後每次移動後+1,以便確定需要移動部分的、被覆蓋的元素在陣列前面部分的位置
如:1 2 3 4 5 6,移動2位,若採用以下**:
for
(int i = num - move%num;i < num;i++
)//move%num是為了防止移動次數過多造成誤判,例如4個元素的陣列移動5個位置還是相當於移動一次
//陣列前一部分元素整體每次向後移動乙個位置
a[0]= temp;
//被覆蓋元素在前端部分的位置為a[flag]
}
其輸出值則為
6 5 1 2 3 4
但是我們需要得到的是5 6 1 2 3 4,因此設定乙個flag,當整體移動一部分陣列元素時,後面的某個元素會被覆蓋,前面的元素會有乙個空餘,flag就是該空餘元素的下標,從而達到題目要求,如下**所示:
for
(int i = num - move%num;i < num;i++
)//陣列前一部分元素整體每次向後移動乙個位置
a[flag]
= temp;
//被覆蓋元素在前端部分的位置為a[flag]
flag++
;}
需要注意的是,可能移動的位置數會比陣列元素個數大,所以需要移動的位置應設定為**m%n**
c語言實現
python語言實現
c語言**
#include
#include
intmain()
for(
int i = num - move%num;i < num;i++
)//move%num是為了防止移動次數過多造成誤判,例如4個元素的陣列移動5個位置還是相當於移動一次
//陣列前一部分元素整體每次向後移動乙個位置
a[flag]
= temp;
//被覆蓋元素在前端部分的位置為a[flag]
flag++;}
for(
int i =
0;i < num;i++
)system
("pause");
return0;
}
python語言**
def move_list()
: a=
list1=
num,move=
map(
int,
input()
.split()
) temp=
0 flag=0if
(num>
100 or num<=
0 or move<0)
:return
0 list1=
list
(map
(int
,input()
.split()
))# a=list(map(int,input().split()))
for i in range
(num)
: a.
(list1[i]
)for i in range
(num-move%num,num)
: temp=a[i]
for j in range
(i-1
,flag-1,
-1):
a[j+1]
=a[j]
a[flag]
=temp
flag=flag+
1for i in range(0
,num):if
(i==num-1)
:print
(a[i]
)else
:print
(a[i]
,end=
" ")
def main()
:move_list()
if __name__ ==
'__main__'
:main
()
PAT乙級1008 陣列元素迴圈右移問題(C語言)
乙個陣列a中存有n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m 0 個位置,即將a中的資料由 a 0 a 1 a n 1 變換為 a n m an 1 a 0 a 1 an m 1 最後m個數迴圈移至最前面的m個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?...
PAT1016乙級c語言
正整數 a 的 da 為 1 位整數 部分 定義為由 a 中所有 da組成的新整數 pa。例如 給定 a 3862767,da 6,則 a 的 6 部分 pa是 66,因為 a 中有 2 個 6。現給定 a da b db 請編寫程式計算 pa pb。輸入格式 輸入在一行中依次給出 a da b d...
PAT1017乙級c語言
本題要求計算 a b,其中 a 是不超過 1000 位的正整數,b 是 1 位正整數。你需要輸出商數 q 和餘數 r,使得 a b q r 成立。輸入格式 輸入在一行中依次給出 a 和 b,中間以 1 空格分隔。輸出格式 在一行中依次輸出 q 和 r,中間以 1 空格分隔。首先輸入的數不能是整型,要...