8.C++经典实例-计算给定几个数字组成的所有不重复的数
例如,我们要计算1,2,3,4,5这五个数,组成不重复的五位数,那么能产生多少个呢?使用最慢的方式,是一个一个计算出来并统计出出现了多少个,如下面的程序:
#include <iostream>
#include <vector>
int main() {
std::vector<int> digits = {1, 2, 3, 4, 5};
int count = 0;
// 使用四重循环生成所有可能的四位数
for (int i = 0; i < 5; ++i) {
for (int j = 0; j < 5; ++j) {
for (int k = 0; k < 5; ++k) {
for (int l = 0; l < 5; ++l) {
for (int m = 0; m < 5; ++m) {
// 确保每个数字只出现一次
if (i != j && i != k && i != l && i != m &&
j != k && j != l && j != m
&& k != l && k != m
&& l != m) {
std::cout << digits[i] << digits[j] << digits[k] << digits[l] << digits[m] << std::endl;
count++;
}
}
}
}
}
}
std::cout << "总共有 " << count << " 个互不相同且无重复数字的四位数。" << std::endl;
return 0;
}
我们运行:
可以看到出现了120个不重复的数字,那么数越多,计算越慢,总不能无限近几年去计算吧,这个时候其实我们就可以用到阶乘的方式了,比如5个不重复的数字,可以出现多少个,那么不可以计算5!=5*4*3*2*1那么这个时候是不是就少了很多,一下子就算出来了,阶乘怎么写程序,咱们前面已经讲过,大家也可以考虑一下,如果里面包含一个0的情况下,应该是多少个数呢?