#include <stdio.h>
void Swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void RotateByPointers(int *first, int *middle, int *last)
{
int *next = middle;
while (first!=next)
{
Swap(first++, next++);
if (next==last) next=middle;
else if (first==middle) middle=next;
}
}
void Rotate(int r, int *array, size_t length) {
if (r < 0) {
r = length + r;
}
RotateByPointers(array, array + length - r, array + length);
}
void Print(int * array, size_t length)
{
for (size_t i = 0; i < length; ++i) {
}
}
int main(void) {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
size_t length = sizeof(array) / sizeof(array[0]);
Rotate(2, array, length);
Print(array, length);
Rotate(-4, array, length);
Print(array, length);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp2b2lkIFN3YXAoaW50ICphLCBpbnQgKmIpCnsKCWludCB0bXAgPSAqYTsKCSphID0gKmI7CgkqYiA9IHRtcDsKfQoKdm9pZCBSb3RhdGVCeVBvaW50ZXJzKGludCAqZmlyc3QsIGludCAqbWlkZGxlLCBpbnQgKmxhc3QpCnsKCWludCAqbmV4dCA9IG1pZGRsZTsKCXdoaWxlIChmaXJzdCE9bmV4dCkKCXsKCQlTd2FwKGZpcnN0KyssIG5leHQrKyk7CgkJaWYgKG5leHQ9PWxhc3QpIG5leHQ9bWlkZGxlOwoJCWVsc2UgaWYgKGZpcnN0PT1taWRkbGUpIG1pZGRsZT1uZXh0OwoJfQp9Cgp2b2lkIFJvdGF0ZShpbnQgciwgaW50ICphcnJheSwgc2l6ZV90IGxlbmd0aCkgewoJaWYgKHIgPCAwKSB7CgkJciA9IGxlbmd0aCArIHI7Cgl9CiAgICBSb3RhdGVCeVBvaW50ZXJzKGFycmF5LCBhcnJheSArIGxlbmd0aCAtIHIsIGFycmF5ICsgbGVuZ3RoKTsKfQoKdm9pZCBQcmludChpbnQgKiBhcnJheSwgc2l6ZV90IGxlbmd0aCkKewogICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewogICAgICAgIHByaW50ZigiJWQgIiwgYXJyYXlbaV0pOwogICAgfQoJcHJpbnRmKCJcbiIpOwp9CiAKaW50IG1haW4odm9pZCkgewogICAgaW50IGFycmF5W10gPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDAgfTsKICAgIHNpemVfdCBsZW5ndGggPSBzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKGFycmF5WzBdKTsKCiAgICBSb3RhdGUoMiwgYXJyYXksIGxlbmd0aCk7CiAgICBQcmludChhcnJheSwgbGVuZ3RoKTsKCiAgICBSb3RhdGUoLTQsIGFycmF5LCBsZW5ndGgpOwogICAgUHJpbnQoYXJyYXksIGxlbmd0aCk7CgogICAgcmV0dXJuIDA7Cn0=