杭电OJ 1030:Delta-wave

43 篇文章 0 订阅
13 篇文章 0 订阅

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

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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值