回旋数的求解

7 篇文章 0 订阅
6 篇文章 1 订阅

回旋数就是从中间的1开始然后围绕着这个1,按自然数的增长形式回旋1,

如:

43

44

45

46

47

48

49

 

42

21

22

23

24

25

26

 

41

20

7

8

9

10

27

 

40

19

6

1

2

11

28

 

39

18

5

4

3

12

29

 

38

17

16

15

14

13

30

 

37

36

35

34

33

32

31

 



1、解决的的思路
a、 首先得到这个数的基数(即每一环开始的数),
b、 然后得到其坐标所属第几排,
c、再次计算其位于这一排的位置,
d、最后算出结果。
2、针对个步骤所需要的编程指南
a、需要知道他前面的总数,设置了一个递归函数来求出来
int F(int n)//
{
if (n==0)
{ return 1;
}
return F(n-1)+(n-1)*8;
}
那么其基数就是
int begin=F(level)+1;//
level为他属于第几环
b、使用两个宏
#define Max(a,b) (a)>(b)?(a):(b)//
#define Abs(a) (a)<0?-(a):(a)//
if (x==level)//第一排
elseif (y==level) //第二排;
elseif (x==-level) //第三排;
其他为第四排
c、第几个需要自己看了
d计算OK


以下为程序
#include <iostream>
#define Max(a,b)  (a)>(b)?(a):(b)   //
#define Abs(a)  (a)<0?-(a):(a)   //求的a的绝对值;




using namespace std;
int F(int n)   //得到第几层的基数-1值;
{
if (n==0)
{  return 1;
}
return F(n-1)+(n-1)*8;
}


int foo(int x,int y)
{
int level=Max(Abs(x),Abs(y));  //得到层数;
if (0==level)  
{  return 1;
}
int m=2*level+1;  //每层的每一排所拥有的个数;
    int k=Abs(x+y);  //在这一排中居于第几个;
int begin=F(level)+1;  //得到每一层的基数;
int result=0;
//以下开始判断其坐标属于那一层;
if (x==level)  //第一排;

 if (k==0)
 {  
   result=level*8-1+begin;
 }
 else {
 result=begin+k-1;
 }
}
else if (y==level)  //第二排;
{
result=m-1+m-k-1-1+begin;
}
else if (x==-level) //第三排;
{
 result=2*(m-1)+k-1+begin;
}
else{  //第四排
result=3*(m-1)+m-k-1-1+begin;
}


return result;
}
void main()
{
  for (int i=-4;i<5;i++)
  { 
  for (int j=-4;j<5;j++)
  { 
  cout<<foo(j,i)<<"\t";
  }
  cout<<endl;
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值