C语言经典例题——第一例
问题:刚好有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
思路:三个数字,每一位数字都代表一重循环,只需要判断让数字不相同即可。
解法一:
#include <stdio.h>int main(){int i,j,k,count=1;for(i=1;i<5;i++)for(j=1;j<5;j++)for(k=1;k<5;k++)if(i!=j&&i!=k&&j!=k)printf("组成第%d个数字是:%d%d%d\n",count++,i,j,k);}
解法二:
在第二重循环就判断,省去不必要循环。
int main(void){int i,j,k,count=0;for(i = 1;i < 5;i++){for(j = 1;j < 5;j++){if(i == j)continue;for(k = 1;k < 5;k++){if(i == k || j == k)continue;printf("%d,%d,%d\n",i,j,k);count++;}}}printf("共有%d种。\n",count);return 0;}
解法三:(个人不建议初学者学习)
int b[4],arr[4];//定义两个数组用来类比int Count=0;//计数器void DFS(int step){int i;if(step==5){if(arr[1]!=arr[2]&& arr[1]!=arr[3]&&arr[2]!=arr[3]){//判断哪些符合条件Count++;printf("%d%d%d\n",arr[1],arr[2],arr[3]);//输出可用排列}return ;}for(i=1;i<=4;i++){if(b[i]==0){arr[step]=i;b[i]=1;//排除重复DFS(step+1);//自己调用自己b[i]=0;}}return ;}int main(void){DFS(1);printf("共有%d种",Count);return 0;}
