这是一个完全的数学题目,主要是找规律。
仔细研究可以找到如下规律:
1.关于给定一个n,求其所在的层。 1层:1个数,2层:3,3层:5,4层:7,……(等差,d = 2,a1 = 1,Sn = (a1 + an)/2 = n^2) 看最右边斜列1,4,9,16,……皆为平方数。 所以n所在的层为:ceil(sqrt(n)) 2.关于网上的左右斜列(或斜行)。 左第一斜列为:1,2,6,5,10,…… 左第二斜列为:4,8,7,13,12,……,以此类推。 右第一斜列为:1,3,4,8,9,15,16,…… 右第二斜列为:2,6,7,13,14,…… 以此类推。 3.关于所求为:fabs(lay1 - lay2) + fabs(left_n - left_m) + fabs(right_n - right_m)。 其中lay1,lay2分别为两个数分别所在的层; left_n ,right_n :分别为输入N的所在左右斜列数;(left,right的表达式在代码中,请读者体会) left_m ,right_m :分别为输入M的所在左右斜列数。 至于为何如此,请读者测试几组N,M的数据,体会如上表达式和所求结果的关系。C++代码如下:
#include <stdio.h>
#include <math.h>
int main()
{
int lay1,lay2,result;
int n,m,left_n,right_n,left_m,right_m;
while(scanf("%d %d",&n,&m) != EOF){
lay1 = (int)ceil(sqrt((double)n)),lay2 = (int)ceil(sqrt((double)m));
left_n = (n - (lay1 - 1)*(lay1 - 1) - 1)/2 + 1, right_n = (lay1 * lay1 - n)/2 + 1;
left_m = (m - (lay2 - 1)*(lay2 - 1) - 1)/2 + 1, right_m = (lay2 * lay2 - m)/2 + 1;
result = (int)fabs((double)(lay1 - lay2)) + (int)fabs((double)(left_n - left_m)) + (int)fabs((double)(right_n - right_m));
printf("%d\n",result);
}
return 0;
}