我生成一个随机整数数组,并尝试将值向右移动,并用前一个最后一个元素替换第一个元素。
输出未排序,最后一个元素是随机生成的整数。
#include <iostream>
#include <cstdlib>
#include <iomanip>
using namespace std;
void shift(int values[], int size) {
int temp;
for (int i = 0; i < size; i++) {
temp = values[size - 1];
values[i] = values[i + 1];
values[0] = temp;
cout << values[i] << setw(4);
}
cout << endl;
}
int main()
{
cout << "Random 10 index array" << endl;
const int CAP = 10;
int numbers[CAP];
srand(time(0));
int i;
for (i = 0; i < CAP; i++) {
int rng = rand() % 100 + 1;
numbers[i] = rng;
cout << numbers[i] << setw(4);
}
cout << "shifting all elements to the right: " << endl;
shift(numbers, CAP);
cout << endl;
system("pause");
return 0;
}
我尝试使用i < size - 1
,但在我需要的10个数字中有9个。
答案 0 :(得分:1)
以下是有问题的代码:
temp = values[size - 1];
此语句不使用循环变量。它为什么坐在循环中?此作业将持续size-1
次。
values[i] = values[i + 1];
您的循环不变量为i <size
,但您尝试访问i+1
。那只是在惹麻烦:)。这就是您在使用i < size-1
时无法获取垃圾值的原因。
values[0] = temp;
同样,这并没有使用循环变量。它不属于循环。您只需反复设置values[0]
。
这是一个有效的解决方案,使用两个临时变量:
void shift(int values[], int size) {
7 int temp = values[size-1], temp1;
8 for (int i = 0; i < size; i++) {
9 temp1 = values[i];
10 values[i] = temp;
11 temp = temp1;
12 cout << values[i] << setw(4);
13 }
14 cout << endl;
15 }
答案 1 :(得分:0)
你试过吗
如果您想要元素的循环移位:
std :: rotate(&amp; arr [0],&amp; arr 1,&amp; arr [10]); ......会做的。你&#39; 11 需要#include算法标题。
Optimal way to perform a shift operation on an array
编辑:正如所指出的,如果直接使用,std :: rotate会向左旋转。 Here是一个示例,在向量上向右旋转并进行一些更改:
#include <vector>
#include <iostream>
#include <algorithm>
int main()
{
std::vector<int> v{2, 4, 2, 0, 5, 10, 7, 3, 7, 1};
// simple rotation to the right
std::rotate(v.rbegin(), v.rbegin() + 1, v.rend());
std::cout << "simple rotate right : ";
for (int n: v)
std::cout << n << ' ';
std::cout << '\n';
}
输出:
simple rotate right : 1 2 4 2 0 5 10 7 3 7