首先从一个简单的入门级的编程题开始吧。
题目
【A】有1,2, 3三个数字,能够组成多少个互不相同且无重复数字的三位数?并将它们全部列举出来。
【B】有1,5,8三个数字,能够组成多少个互不相同且无重复数字的三位数?并将它们全部列举出来。
A参考答案:
public static void test(){
int count=0;
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
for(int k=1;k<=3;k++){
if(i!=j&&i!=k&&j!=k){
count++;
System.out.println(""+i+j+k);
}
}
}
}
System.out.println("个数:"+count);
}
B参考答案:
public static void test01(){
int count=0;
int[] a={1,5,8};
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
for(int k=0;k<3;k++){
if(a[i]!=a[j]&&a[i]!=a[k]&&a[j]!=a[k]){
count++;
System.out.println(""+a[i]+a[j]+a[k]);
}
}
}
}
System.out.println("个数:"+count);
}
解题思路:
分析题目,将解题思路划分为两个步骤,一、组成一个三位数,二、给组成三位数的过程中添加限定条件。
一、如何组成一个三位数,第一次生成百位上的数,第二次生成十位上的数,第三次生成个位上的数,很明显能够联想到三个for循环,生成的数彼此之间互不相同,但是却存在多个数的不同位数上有相同的数。
二、通过判断每一位上的数都不相同来实现条件限定。
通过代码实现和数学实现还是有点区别,计算机的实现思路就是通过顺序分支循环来处理问题,特点就是快速机械重复,与人的自然思维略微有点不同,人的自然思维一般都是比较直接。比如说:我们一般进行排列的时候,第一个数选了1,很自然的就把剩下的数就从2和3中进行选择,直接就把每一位上的数不同这个条件给添加进来了。
由于计算机的快速机械重复的特点,计算机处理问题可以使用人的自然思维看起来很笨的思路,就是将所有的情况列举出来,但是这种思路在计算机处理实际问题中相当普遍和经典,人们将这种思路称之为:穷举法。