杭电OJ 1030:Delta-wave

来源:互联网 发布:管家婆软件安装 编辑:程序博客网 时间:2024/05/22 04:35

这是一个完全的数学题目,主要是找规律。

仔细研究可以找到如下规律:

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;}


0 0
原创粉丝点击