1008 数组元素循环右移问题(20 分)(C/C++)
1008 数组元素循环右移问题(20 分)
一个数组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位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
思路理清楚就行:
既然不能定义另一个数组,那就把我们存储数据的数组扩大两倍,向后移也就是下标的移动。而且观察得出,移动M位,实际是移了(M % N)位。
1.将数组下标向后移动(M % N)位
2.将超出下标N - 1的数,赋值给数组前面(相当于移动到前面)。为了移动方便,可以定义一个(M %N)== 0时,直接输出数组。
C++版本
#include <bits/stdc++.h> using namespace std; int main() { int N, M, k; int *ptr; cin >> N; cin >> M; ptr = new int[2 * N](); for (int i = 0; i < N; ++i) { cin >> ptr[i]; } k = M % N;//计算移动位数 if (0 == k) {//k等于0时直接输出 for (int i = 0; i < N; ++i) { cout << ptr[i]; if (i != N - 1) cout << " "; } return 0; } for (int m = N - 1; m >= 0; --m) {//向后移动 ptr[m + k] = ptr[m]; } for (int j = 0; j < k; ++j) {//超出N-1部分,放前面 ptr[j] = ptr[N + j]; } for (int i = 0; i < N; ++i) {//输出 cout << ptr[i]; if (i != N - 1) cout << " "; } delete[] ptr; return 0; }
C语言版本:
#include <stdio.h> #include <stdlib.h> #include <string.h> #pragma warning(disable:4996) int main() { int N, M, k, n, j, m, i; int *ptr; scanf("%d%d", &N, &M); ptr = (int*)malloc(sizeof(int) * 2 * N); memset(ptr, 0, 2 * N); for (int i = 0; i < N; ++i) { scanf("%d", &ptr[i]); } k = M % N;//计算移动位数 if (0 == k) {//k等于0时直接输出 for (i = 0; i < N; ++i) { printf("%d", ptr[i]); if (i != N - 1) printf(" "); } return 0; } for (m = N - 1; m >= 0; --m) {//向后移动 ptr[m + k] = ptr[m]; } for (j = 0; j < k; ++j) {//超出N-1部分,放前面 ptr[j] = ptr[N + j]; } for (n = 0; n < N; ++n) {//输出 printf("%d", ptr[n]); if (n != N - 1) printf(" "); } return 0; }
那个#pragma...VS需要

浙公网安备 33010602011771号