数组旋转
谁有算法?将一个一维数组按长128宽8的方式旋转180度存储???
[解决办法]
//将一个一维长度10的数组按长5宽2的方式旋转180度存储???//一维长度10的数组://0 1 2 3 4 5 6 7 8 9//长5宽2://0 1 2 3 4//5 6 7 8 9//旋转180度://9 8 7 6 5//4 3 2 1 0#include <stdio.h>#define ALEN 10 //1024#define BWIDTH 5 //128#define BHEIGHT 2 //8int a[ALEN];int b[BHEIGHT][BWIDTH];int y,x,i;void main() { for (i=0;i<ALEN;i++) a[i]=i; i=0; for (y=BHEIGHT-1;y>=0;y--) { for (x=BWIDTH-1;x>=0;x--) { b[y][x]=a[i]; i++; } } for (y=0;y<BHEIGHT;y++) { for (x=0;x<BWIDTH;x++) { printf("%d ",b[y][x]); } printf("\n"); }}
[解决办法]
可以使用交换的思想:
设定一个元素为初始元素为基准,如果它的下标为i,通过i的值,可以算出旋转后的位置,两个元素交换
设定交换过来的元素为基准,循环上面的操作,至128*8次
counter=0;index=0;//counter用作计数 index表示基准元素下标
while (counter<128*8)
{
tmp1 = a[index]/128;
tmp2 = a[index]%128;
tmp3 = tmp1+tmp2*128;
if ( tmp3 == index )
{
index++;//如果某个元素不应该交换位置,则说明index位置的元素已经确定了,应更换index
}
else
{
swap_tmp = a[index];
a[index] = a[swap_tmp];
a[tmp4] = swap_tmp;
counter++;//每次交换表示有一个元素找到了旋转后的位置
}
}
[解决办法]
我把写有数组的纸倒过来看.....
奇怪,是这样吗?
main()
{
int a[1024],b[8][128],m=1024,i,j;
for(i=0;i<8;i++)
for(j=0;j<128;j++)
b[i][j]=a[--m];
}