您的位置:首页 > 其它

有趣的数字环的算法实现

2013-08-11 09:25 211 查看
看到这么个数字环,感觉很有趣,于是就想着用算法实现此数字环。

首先附图看效果,看是什么样的数字环









其实这个东西的算法实现是很简单的,写下它,是因为它代表了一种在算法中常用的一种思想,把一些看似很复杂很杂乱的想办法归一成一两种方式。计算机程序是很傻的,只会做你让它做的事。当你把问题分析清楚后,把杂乱的规律统一成类似的步骤即可!

下面看源码和注释:

/**
**算法思想:
**观察数字的排布规律,树妖观察完全平方数的分布特点
**观察到奇数的完全平方数在右上角,偶数的完全平方数在左下角
**对于某一个奇数来说,它是在该奇数的前一个偶数的数字圈的基础上依次添加了左、上两个半圈,从左下角走到了右上角
**对于某一个偶数来说,它是在该偶数的前一个奇数的数字圈的基础上依次添加了右、下两个半圈,从右上角走到了左下角
**如此拆分后,无论多大的数字圈,都可以这么归一了(当然,1是例外,它的前面没有数字)
**使用二维数组来表示比较简单,首要的是找到起始位置的坐标,然后依次如上的规律变化即可
**举例:
**当输入数字7时,显然是49个数字,但是我们只考虑index为1~7时七个步骤。首先分析数字1的坐标为(3,3)【注,以左上角为原点的“坐标”】
**那么定下1的位置后,第二步:index为2,此时是从上一个奇数1的位置依次通过右边、下边两个位置走到了左下角的数字4
**第三步:index为3,此时是从上一个偶数2的位置依次通过左边、上边两个位置来到了右上角的数字9
**接下来的4步都是这么一圈圈的走下来
**可以发现,无论多大的数字圈,我们都可以把它看成是在最小的数字圈上依次的叠加起来的
**/
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("请输入一个大于0的数字:");
int length=0;
scanf("%d",&length);
if(length<1)
{
printf("输入的数字有误\n");
return;
}
printf("\n\n");
int num[length][length];
int x=(length+1)/2-1;//获取数字1的x坐标
int y=(length+1)/2-1;//获取数字1的y坐标
num[x][y]=1;//初始化1
int index=1;//指示循环次数
int value=1;//指定二位数组的各个点的值
while(index<length)
{
index++;
if(index%2)//此时是奇数项
{
--x;
int i;
for(i=0; i<index; i++)
num[x][y--]=++value;
++y;
for(i=0; i<index-1; i++)
num[++x][y]=++value;
}
else
{
++x;
int i;
for(i=0; i<index; i++)
num[x][y++]=++value;
y--;
for(i=0; i<index-1; i++)
num[--x][y]=++value;
}
}
for(y=0; y<length; y++)
{
for(x=0;x<length;x++)
printf("%d\t",num[x][y]);
printf("\n");
}
printf("\n\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐