PAT乙级1008题(C语言与Python语言的实现)
题目描述
本文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个位置还是相当于移动一次 { temp = A[i];//存储需要被覆盖的元素 for (int j = i-1;j >=0;j--) { A[j + 1] = A[j]; } //数组前一部分元素整体每次向后移动一个位置 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++) { temp = A[i];//存储需要被覆盖的元素 for (int j = i-1;j >=flag;j--) { A[j + 1] = A[j]; } //数组前一部分元素整体每次向后移动一个位置 A[flag] = temp;//被覆盖元素在前端部分的位置为A[flag] flag++; }
- 需要注意的是,可能移动的位置数会比数组元素个数大,所以需要移动的位置应设置为**M%N**
C语言实现
Python语言实现
C语言代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
int A[100];
int Num,Move;
int temp = 0;//存储需要被覆盖的值
int flag = 0;
scanf_s("%d %d", &Num,&Move);
if (Num > 100 || Num <= 0 || Move < 0)
return 0;
for (int i = 0;i < Num;i++)
{
scanf_s("%d", &A[i]);
}
for (int i = Num - Move%Num;i < Num;i++)
//Move%Num是为了防止移动次数过多造成误判,例如4个元素的数组移动5个位置还是相当于移动一次
{
temp = A[i];//存储需要被覆盖的元素
for (int j = i-1;j >=flag;j--)
{
A[j + 1] = A[j];
}
//数组前一部分元素整体每次向后移动一个位置
A[flag] = temp;//被覆盖元素在前端部分的位置为A[flag]
flag++;
}
for (int i = 0;i < Num;i++)
{
if (i == Num - 1)
printf("%d", A[i]);
else
printf("%d ", A[i]);
}
system("pause");
return 0;
}
Python语言代码
def Move_List():
A=[]
List1=[]
Num,Move= map(int,input().split())
temp=0
flag=0
if(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.append(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+1
for 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()