# 题目

有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

# 分析

定义三个变量分别代表个位、十位、百位,用三层 for 循环判断个位不等于十位和百位,十位不等于百位,最后把结果输出

# 代码实现

c
#include <stdio.h>
int main(int argc, char argv[])
 
{
	int units,tens,hundreds;
	
	for(units=1;units<5;units++)
		for(tens=1;tens<5;tens++)
			for(hundreds=1;hundreds<5;hundreds++)
				if( units!=tens && units!=hundreds && tens!=hundreds )
					printf("%d%d%d\n",units,tens,hundreds);	
	return 0;
}

运行结果

# 扩展练习

写一个可以生成 6 位互不相同的密码生成器,密码字符包含数字、大小写字母和特殊字符

# 分析

通过查看 ASCII 编码表可以发现十进制 48 到 57 为数字 0 ~ 9,65 到 90 为大写字母 A ~ Z,97 到 122 为小写字母 a ~ z,33 到 47、58 到 64、91 到 96,123 到 126 都为特殊字符,直接采用类型转换方式,将十进制 33 ~ 126 强制转换成 char 类型输出对应的字符

我写的代码比较简单,六层 for 循环自己跑了一下感觉速度很慢,不知道有没有什么办法可以优化,我这边代码结果直接输出到屏幕,如果需要写入文件需要自己对代码修改一下

# 代码

c
#include <stdio.h>
int main(int argc, char argv[])
 
{
	int a,b,c,d,e,f;
	
	for(a=33;a<127;a++)
		for(b=33;b<127;b++)
			for(c=33;c<127;c++)
				for(d=33;d<127;d++)
					for(e=33;e<127;e++)
						for(f=33;f<127;f++)
							printf("%c%c%c%c%c%c\n",(char) a,(char) b,(char) c,(char) d,(char) e,(char) f );
	
	return 0;
}