day10,一道竞赛题

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int w, m, n, i, j, k, p, t;
	scanf("%d%d%d", &w, &m, &n);
	if (m % w == 0)
	{
		i = m / w - 1;              //是w的倍数时层数要减一。
	}
	else
	{
		i = m / w;
	}
	if (n % w == 0)
	{
		j = n / w - 1;
	}
	else
	{
		j = n / w;
	}                                //分别求出m,n所在的层数。
	if (j > i)
	{
		t = j - i;//往下走所需要的层数
		k = t / 2;//表示每两层合为一层(奇数层加偶数层)
		if (t % 2 == 0)
		{
			p = n - (m + (w * 2) * k);   //m+(w*2)*k则是求出m垂直于n层的数字。偶数层所需要的。
		}
		else if (n > ((m + (w * 2) * k) + 2 * ((i + 1) * w - m + 1) - 1))
               // 2 * ((i + 1) * w - m + 1) - 1表示2n-1,因为上下两层的数字之间存在等差数列的关系

		{
			p = n - ((m + (w * 2) * k) + 2 * ((i + 1) * w - m + 1) - 1);//奇数层所需要的。
		}
		else
		{
			p = -(n - ((m + (w * 2) * k) + 2 * ((i + 1) * w - m + 1) - 1));
		}
	}
	else//这里是相当于更换m和n的位置当m更大时。又执行了一遍。
	{
		t = i- j;                         
		k = t / 2;                       
		if (t % 2 == 0)
		{
			p = m - (n + (w * 2) * k);   
		}
		else if (m > ((n + (w * 2) * k) + 2 * ((j+ 1) * w - n + 1) - 1))
		{
			p = m - ((n + (w * 2) * k) + 2 * ((j + 1) * w - n + 1) - 1);          //奇数层所需要的。
		}
		else
		{
			p = -(m - ((n + (w * 2) * k) + 2 * ((j + 1) * w - n + 1) - 1));
		}

	}
	printf("%d\n", p + t);//本质上就是先让m移下来(求相差几层),再考虑n离m移下来的距离
	printf("此程序由23本计算机2班18号辛凯编写");
	return 0;
}

菜鸟一个,欢迎斧正。

  • 15
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值