zoukankan      html  css  js  c++  java
  • PAT 1008(数组循环右移问题)

    一个数组中存有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个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?0​​A1​​AN1​​)变换为(ANM​​AN1​​A0​​A1​​ANM1​​)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

    输入格式:

    一个数组A中存有N( > 0每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

    输出格式:

    在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格

    本题考虑三种情况:1、M==N 2、M%N==0 3、M%N!=0

    	#include<iostream>
    	using namespace std;
    	int main()
    	{
    		int arry[1000] = { 0 };
    		int N = 0, M = 0;
    		cin >> N >> M;
    		//检测输入的M N是否满足要求
    		while (N < 1 || N>100||M<0)
    		{
    			cin >> N>>M;
    		}
    		//解决M%N!=0的情况
    		if ((M % N) != 0)
    		{
    			M = M % N;
    		}
    		for (int i = M; i <N+M; i++)
    		{
    			cin >> arry[i];
    		}
    		//普通情况下的移位
    		if (N >= M)
    		{
    			for (int j = N; j < N + M; j++)
    			{
    				arry[j - N] = arry[j];
    			}
    			for (int k = 0; k < N; k++)
    			{
    				cout << arry[k];
    				if (k != N - 1)
    				{
    					cout << " ";
    				}
    			}
    		}
    		//因为我采用的是在特殊位置输入数组,所以M==N时采用下面的条件
    		else if((M%N)==0)
    		{
    			for (int i = M; i < N+M; i++)
    			{
    				cout << arry[i];
    				if (i != N+M- 1)
    				{
    					cout << " ";
    				}
    			}
    		}
    		return 0;
    	}
    	//M=N,M%N==0,M%N!=0;
    
  • 相关阅读:
    Eclipse 中怎样自动格式化代码?
    如何使用Jfreechart生成柱状图?
    ADT OOP
    5.2 Construction for Reuse
    Lab6实验的一些思考
    软件构造的八个多维视图
    软件构造笔记5.1 Metrics, Morphology and External Observations of Reusability
    事后诸葛亮之感谢
    (Model)针对编译错误的友好提示
    第二次结对作业
  • 原文地址:https://www.cnblogs.com/zongji/p/12228944.html
Copyright © 2011-2022 走看看