代码改变世界

C++第二次作业

2018-11-26 10:56  water_chen  阅读(190)  评论(0编辑  收藏  举报

针对中段测试的结果、新手赛的比赛情况,以及之前的课前预习、课中学习、和课后作业情况,回答如下问题:

1  目前自己学习中存在的薄弱的知识点具体有哪些?每个薄弱的知识点都是如何获知的,每个薄弱的知识点需要列举具体的例子说明。(5分)

2  从第五章函数到第七章数组的函数题和编程题(主要是在PTA)中选出至少一道你觉得比较有挑战的题(已解决且不是奇奇的题)。写出解题报告包括:(1)题目大意;(2)解题思路;(3)代码思路,比如画出流程图;(4)核心技术总结;(5)解题过程中存在的问题,以及如何得到解决的。(5分)

1、对c++一些基础理论不太熟悉,特别是导入包的问题,可能习惯了java和Python的补全和提示,对c++导入的包不熟悉,所以只能多打代码,熟悉包的名称。

2、

(1)题目大意

7-1 数组元素循环右移问题 (20 分)

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(0)个位置,即将A中的数据由(A0​​A1​​AN1​​)变换为(ANM​​AN1​​A0​​A1​​ANM1​​)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入N(1N100)和M(0);第2行输入N个整数,之间用空格分隔。

输出格式:

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

输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

(2)解题思路
不管右移还是左移,对于一个数组来说,都可以看做一个方向移动移动,这道题只需要要求右移M位,只需要将末尾
的M个数放到数组前头,然后前面的N-M个往后移就可以了。
(3)代码思路
#include<iostream>
using namespace std;

int main(){
    int n ,b;
    cin >> n >> b;
    b = b%n;
    int a[n];
    for(int i=0;i<n;i++){
        cin >> a[i];
    }
    for(int i=n-b;i<n;i++){
        cout <<a[i]<<" ";
    }
    for(int i =0;i<n-b;i++){
        if(i ==0){
            cout<< a[i];
        }
        else{
            cout<<" "<<a[i];
        }
        
    }

}

这道题我只用简单的输入输出来完成,没有另建数组,这其实是不太明智的选择,但如果这是局限于这道题,为了节省空间复杂度,这种方法就足够了,但如果接下来需要这个变化之后的数组,就需要建立额外的数组来存放。

(4)核心技术总结

先输出后M位,在输出前N-M位

(5)解题过程存在的问题及解决

可能就逻辑上需要一点思考,只要明白数组移动是什么原理,就可以将左移和右移归为一类问题来求解。