第二次博客作业

1

  目前我学习中存在的薄弱的知识点具体是结构体、共同体、枚举类型与指针。在近几次的PTA练习中(大概是练习8-练习10)我常常被题目卡住,想到思路但是不知道应该怎么写下代码。在结构体中具体的例子是定义结构体类型变量。

  我一开始无法理解结构体类型与结构体类型变量的定义,导致对结构体成员引用出现错误。共用体和枚举类型则是因为很少运用于做题,对这两者不够熟悉,遇到需要运用共用体和枚举类型知识的题目就不知道应该怎么做。例如书本141页例8.4,我仍不能理解。我指针知识由于是新知识,仍然需要花时间去深入了解。在二维数组与指针上仍要更多精力去钻研。

 

2

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

一个数组A中存有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个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

① 题目大意是要移动一个数组里面的数字,改变他们的位置。

② 题目分两种情况,其中要考虑N>M/N<M

③ 

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

int a[100],b,c,i;

cin>>b>>c;

if(b>c)

{

for(i=0;i<b;i++)

cin>>a[i];

{if(b==1&&c==0) cout<<a[0];else

cout<<a[b-c];}

for(i=1;i<c;i++)

cout<<" "<<a[b-c+i];

for(i=0;i<b-c;i++)

 {if(b==1&&c==0) cout<<endl;else cout<<" "<<a[i]; }}

else if(c>b)

{

int d;

d=c-b;

for(i=0;i<b;i++)

cin>>a[i];

cout<<a[b-d];

for(i=1;i<d;i++)

cout<<" "<<a[b-d+i];

for(i=0;i<b-d;i++)

cout<<" "<<a[i]; }

else

{

for(i=0;i<b;i++)

cout<<a[i];

}

}

④ 其中最重要的一点就是找出数字移动前后下标的关系。

N>M时,如果i+Mi为下标)大于或等于N,则数字移动到下标为i+M除以N的余数的位置上。否则数字移动到下标为i+M的位置上。

N<M时,设KM除以N的余数,如果i+Ki为下标)大于或等于N,则数字移动到下标为i+K除以N的余数的位置上。否则数字移动到下标为i+K的位置上。

⑤ 问题最大的就是找出数字移动前后的下标之间的关系,要先用白纸设一组数组来找寻他们之间的关系会比较清晰。只要找到了两者的关系题目就很容易了,但是写成代码需要时间思考一下。

posted @ 2018-12-06 17:45  LeungK  阅读(150)  评论(0编辑  收藏  举报