随即从0-100里取5个数,问他们相加得到100的程序组合

这篇博客讨论了一种优化算法,避免了传统累次for循环导致的效率低下问题。作者指出,通过确保每个数的范围在0到100减去前一个数之间,可以显著减少计算次数。这种方法对于寻找五个数相加等于100的组合尤其有效,避免了如传统方法那样指数级的增长。文章提醒,若需输出结果,应避免频繁的文本IO流操作,以提高性能。

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

先上一下代码

 

/**
 * @author : Administrator
 * @date : 2019-02-27 09:47
 */
public class FiveNumberAddToOneHundred {

	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		int count = 0;
		int firstEnd = 100;
		int start = 0;
		for (int firstNum = 0; firstNum < firstEnd; firstNum++) {
			int secondEnd = firstEnd - firstNum;
			for (int secondNum = start; secondNum < secondEnd; secondNum++) {
				int thirdEnd = firstEnd - (firstNum + secondNum);
				for (int thirdNum = start; thirdNum < thirdEnd; thirdNum++) {
					int fourEnd = firstEnd - (firstNum + secondNum + thirdNum);
					for (int fourNum = start; fourNum < fourEnd; fourNum++) {
						int fiveNum = firstEnd - (firstNum + secondNum + thirdNum + fourNum);
						count++;
						// System.out.println("firstNum:" + firstNum + "\tsecondNum:" + secondNum + "\tthirdNum:" + thirdNum + "\tfourNum:" + fourNum + "\tfiveNum:" + fiveNum);
					}
				}
			}
		}
		System.out.println("共执行了" + count + "次!");
		System.out.println("共消耗了:" + (System.currentTimeMillis() - startTime)  + "ms");
	}
}

算法思路:

一般人的想法是不断的进行累次for循环,但是那种效率我们简单算一下.

一个数的情况下是1次;

两个数是100*100次,也就是1万次;

三个数是100*100*100次,也就是100万次;

四个数是100*100*100*100次,也就是1亿次;

五个数是100*100*100*100*100次,也就是100亿次;

.....

这种增幅是很可怕的,六个数就是1万亿次了,十个数恐怕就需要超级计算机来算了.

 

效率很低

 

我的算法思路是:

假设现在是两个数,那么第一个数从0开始到100.第二个数想要加到的结果为100,那么第二个数就必然是0到100-第一个数这种之间的范围之内.这种的就明显减少了不可能的数了,直接挑对我需要的数.

按照这种道理依次向下扩展.

最后的结果统计了一下

个数原始循环次数算法循环次数差距比(倍)
一个数11无差距
两个数10000100100
三个数100万5151194
四个数1亿176851565
五个数100亿次45981262174


算法的每一次循环都是一个结果,也就是说除此之后很难再提高了.

 

上面的程序中,如果需要输入出来,不建议直接输出到控制台,可先暂存起来,每次的文本输出IO流都需要花费大量的时间

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值