题目:一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入:每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出:在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
思路:第一步是处理数据M,先判断M是否大于0,若等于0则说明没有移动数据,将数据写入数组再输出即可,若M大于0,则再判断M是否大于N,若M大于N则说明它将数据移动了若干个循环,此时只取最后一轮移动即可。处理完M之后使用calloc动态分配一个M+N大小的数组空间,因为需要移动M位那我们就从数组的第M+1个位置开始写入数据,最后将数组的第N+1到N+M个数据移动到,第1到M个位置即可。移动的步数为M步,N>M>0,算得上比较少了吧
#includeusing namespace std; int main(){ int N,M; cin>>N>>M; if(M>0) { if(M>N) M%=N; int *a=(int *)calloc(N+M,4); if(a!=NULL){ for(int n=M;n >a[n]; for(int n=0;n a[n]; for (int n = 0;n < N - 1;n++) cout << a[n] << ' '; cout << a[N - 1] << 'n'; free(a);} } return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)