先上一下代码
/**
* @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-第一个数这种之间的范围之内.这种的就明显减少了不可能的数了,直接挑对我需要的数.
按照这种道理依次向下扩展.
最后的结果统计了一下
个数 | 原始循环次数 | 算法循环次数 | 差距比(倍) |
一个数 | 1 | 1 | 无差距 |
两个数 | 10000 | 100 | 100 |
三个数 | 100万 | 5151 | 194 |
四个数 | 1亿 | 176851 | 565 |
五个数 | 100亿次 | 4598126 | 2174 |
算法的每一次循环都是一个结果,也就是说除此之后很难再提高了.
上面的程序中,如果需要输入出来,不建议直接输出到控制台,可先暂存起来,每次的文本输出IO流都需要花费大量的时间