project euler 86

本文探讨了在特定条件下,长方体内部两点间最短路径长度为整数的长方体数量超过一百万时的最小尺寸。通过算法计算,发现当M值达到某一特定数值时,符合条件的长方体数量首次超过一百万。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem 86


Cuboid route

A spider, S, sits in one corner of a cuboid room, measuring 6 by 5 by 3, and a fly, F, sits in the opposite corner. By travelling on the surfaces of the room the shortest “straight line” distance from S to F is 10 and the path is shown on the diagram.

However, there are up to three “shortest” path candidates for any given cuboid and the shortest route doesn’t always have integer length.

It can be shown that there are exactly 2060 distinct cuboids, ignoring rotations, with integer dimensions, up to a maximum size of M by M by M, for which the shortest route has integer length when M = 100. This is the least value of M for which the number of solutions first exceeds two thousand; the number of solutions when M = 99 is 1975.

Find the least value of M such that the number of solutions first exceeds one million.


长方体路径

蜘蛛S位于一个6乘5乘3大小的长方体屋子的一角,而苍蝇F则恰好位于其对角。沿着屋子的表面,从S到F的最短“直线”距离是10,路径如下图所示:

然而,对于任意长方体,“最短”路径实际上一共有三种可能;而且,最短路径的长度也并不一定为整数。

当M=100时,若不考虑旋转,所有长、宽、高均不超过M且为整数的长方体中,对角的最短距离是整数的恰好有2060个;这是使得该数目超过两千的最小M值;当M=99时,该数目为1975。

找出使得该数目超过一百万的最小M值。

package projecteuler;

import junit.framework.TestCase;

public class Prj86 extends TestCase {

	public static final int LIMIT = 1000000;

	public void testCuboidRoute() {

		int count = 1975;

		int len = 99 + 1;
		// len >= width >= height
		boolean find = false;
		for (;; len++) {

			for (int width = 2; width <= len; width++) {

				for (int height = 1; height <= width; height++) {
					if (height == width && height == len) {
						continue;
					}

					if (isSquare((int) (Math.pow(len, 2) + Math.pow(width
							+ height, 2)))) {
						count++;
					}

					if (count >= LIMIT) {
						find = true;
						break;
					}
				}
				if (find) {
					break;
				}
			}

			if (find) {
				break;
			}
			String fstr = "count=%d,M=%d";
			fstr = String.format(fstr, count, len);
			System.out.println(fstr);
		}

		String fstr = "count=%d,M=%d";
		fstr = String.format(fstr, count, len);
		System.out.println(fstr);
	}

	boolean isSquare(int num) {
		int val = (int) Math.sqrt(num);
		return val * val == num;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值