PAT乙级1008 C语言和Python语言实现

PAT乙级1008题(C语言与Python语言的实现)

题目描述
在这里插入图片描述
本文C语言代码是按照Visual Studio 2019的标准来写的,提交时需要将scanf_s改为scanf,并注释掉system(“pause”)语句

分析

  1. 设置一个数组,长度为100
  2. 题目要求不能使用额外的数组,只能使用一个数组,因此需要考虑数组内元素的整体移动
  3. 由于采用一般的移动方式会使得需要从后移至前面的数组元素顺序逆序,因此需要设置一个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++;
    }
    
  4. 需要注意的是,可能移动的位置数会比数组元素个数大,所以需要移动的位置应设置为**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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值