これは、Colinのアイデアの長いバージョンのCバージョンです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int gcd(int a, int b) {
int t;
if (a < b) {
t = b; b = a; a = t;
}
while (b != 0) {
t = a%b;
a = b;
b = t;
}
return a;
}
double arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
int s_arr = sizeof(arr)/sizeof(double);
/* We assume 1 <= by < s_arr */
void rotate(double *arr, int s_arr, int by) {
int i, j, f;
int g = gcd(s_arr,by);
int n = s_arr/g;
double t_in, t_out;
for (i=0; i<g; i++) {
f = i;
t_in = arr[f + s_arr - by];
for (j=0; j<n; j++) {
t_out = arr[f];
arr[f] = t_in;
f = (f + by) % s_arr;
t_in = t_out;
}
}
}
void print_arr(double *arr, int s_arr) {
int i;
for (i=0; i<s_arr; i++) printf("%g ",arr[i]);
puts("");
}
int main() {
double *temp_arr = malloc(sizeof(arr));
int i;
for (i=1; i<s_arr; i++) {
memcpy(temp_arr, arr, sizeof(arr));
rotate(temp_arr, s_arr, i);
print_arr(temp_arr, s_arr);
}
}