the question is, how write function shifts array's elements given number, whether number positive or negative? example, given array
{22, 33, 44, 55, 66, 77, 88, 99}
and user wants shift 3 elements, array should become:
{77, 88, 99, 22, 33, 44, 55, 66}
my declaration function looks void rotate(int a[], int n, int k)
where:
a
arrayn
number of elements in arrayk
numbers of elements shift by
so above example call: void rotate(a, 8, 3)
this have far:
#include <iostream> using namespace std; void rotate (int [], int, int); int main() { cout << "how many numbers wanna enter?"<< endl << "enter number: "; int n; int i; cin >> n; int a[n]; cout << "now have enter " << n << "number in array."<< endl<< "pls eneter number aaray"<<endl; (i=0; i<n; i++) { cout << "a["<<i<<"] = "; cin >> a[i]; } cout << "how many numbers wanna shift?"<< "pls eneter number: "; int k; cin >> k; rotate(a,n,k); (i=0; i<n; i++) cout<<"a["<<i<<"] = "<<a[i]<<endl; return 0; } void rotate (int a[] , int n , int k ){ if (k>0){ } else if (k<0){ } }
as nathan oliver states you're trying reinvent rotate
. given input: int a[] = {22,33,44,55,66,77,88,99}
do:
rotate(begin(a), next(begin(a), ((-k % size(a)) + size(a)) % size(a)), end(a));
if don't have c++17, can this:
const auto size = sizeof(a) / sizeof(a[0]); rotate(begin(a), next(begin(a), ((-k % size) + size) % size), end(a));
let me unpack math here:
- the interior
(-k % size(a))
invertsk
matchrotate
's approach, mods ensurek < size(a) && -k > size(a)
- the middle addition:
((-k % size(a)) + size(a))
removes negative such value lesssize(a) * 2
, greater0
- the exterior
((-k % size) + size) % size
puts value in range of legal inputsnext
; lesssize(a)
, greater or equal0
next(begin(a), ((-k % size) + size) % size)
selecting element of array rotated first element in array:
- for
k = 7
first element be:next(begin(a), 1)
,a
contain:{33, 44, 55, 66, 77, 88, 99, 22}
- for
k = 6
first element be:next(begin(a), 2)
,a
contain:{44, 55, 66, 77, 88, 99, 22, 33}
- for
k = 5
first element be:next(begin(a), 3)
,a
contain:{55, 66, 77, 88, 99, 22, 33, 44}
- for
k = 4
first element be:next(begin(a), 4)
,a
contain:{66, 77, 88, 99, 22, 33, 44, 55}
- for
k = 3
first element be:next(begin(a), 5)
,a
contain:{77, 88, 99, 22, 33, 44, 55, 66}
- for
k = 2
first element be:next(begin(a), 6)
,a
contain:{88, 99, 22, 33, 44, 55, 66, 77}
- for
k = 1
first element be:next(begin(a), 7)
,a
contain:{99, 22, 33, 44, 55, 66, 77, 88}
- for
k = 0
first element be:next(begin(a), 0)
,a
contain:{22, 33, 44, 55, 66, 77, 88, 99}
- for
k = -1
first element be:next(begin(a), 1)
,a
contain:{33, 44, 55, 66, 77, 88, 99, 22}
- for
k = -2
first element be:next(begin(a), 2)
,a
contain:{44, 55, 66, 77, 88, 99, 22, 33}
- for
k = -3
first element be:next(begin(a), 3)
,a
contain:{55, 66, 77, 88, 99, 22, 33, 44}
- for
k = -4
first element be:next(begin(a), 4)
,a
contain:{66, 77, 88, 99, 22, 33, 44, 55}
- for
k = -5
first element be:next(begin(a), 5)
,a
contain:{77, 88, 99, 22, 33, 44, 55, 66}
- for
k = -6
first element be:next(begin(a), 6)
,a
contain:{88, 99, 22, 33, 44, 55, 66, 77}
- for
k = -7
first element be:next(begin(a), 7)
,a
contain:{99, 22, 33, 44, 55, 66, 77, 88}
Comments
Post a Comment