题目描述
有4个互不相同的数字,输出由其中三个不重复数字组成的排列。
输入格式
4个整数。
输出格式
所有排列
样例输入
1 2 3 4
样例输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
1 2 4
1 4 2
2 1 4
2 4 1
4 1 2
4 2 1
1 3 4
1 4 3
3 1 4
3 4 1
4 1 3
4 3 1
2 3 4
2 4 3
3 2 4
3 4 2
4 2 3
4 3 2
代码分析
-
#include <stdio.h>
:包含标准输入输出库,用于进行输入输出操作。 -
int main(void)
:定义主函数,void
表示不需要任何参数。 -
int arr[4];
:声明一个整型数组arr
,大小为4,用于存储用户输入的整数。 -
for (int i = 0; i < 4; i++)
:外层循环,用于读取用户输入。 -
scanf("%d", &arr[i]);
:通过scanf
函数从标准输入读取一个整数,并将其存储在数组arr
的第i
个位置。 -
int m = 3;
:声明一个整型变量m
并初始化为3,这个变量用于在循环中指定要跳过的元素的索引。 -
while (m >= 0)
:定义一个while循环,条件是m
大于等于0,循环会执行4次,因为m
将从3递减到0。 -
for (int i = 0; i < 4; i++)
:第一个嵌套循环,用于遍历数组arr
中的元素。 -
if (i == m) continue;
:如果当前索引i
等于要跳过的索引m
,则跳过当前循环的剩余部分。 -
for (int j = 0; j < 4; j++)
:第二个嵌套循环,用于与外层循环中的元素进行配对。 -
if (j == m) continue;
:同上,跳过索引为m
的元素。 -
for (int k = 0; k < 4; k++)
:第三个嵌套循环,用于与前两个循环中的元素进行配对。 -
if (k == m) continue;
:同上,跳过索引为m
的元素。 -
if (i != j && i != k && j != k)
:一个条件判断,确保i
、j
、k
三个索引互不相同,即生成的三元组中没有重复的元素。 -
printf("%d %d %d \n", arr[i], arr[j], arr[k]);
:如果条件满足,则打印三元组arr[i]
、arr[j]
、arr[k]
。 -
m--;
:在while循环的每次迭代结束时,将m
减1,这样在下一次迭代中,会跳过数组中的下一个元素。 -
return 0;
:主函数返回0,表示程序正常结束。
整体流程分析
- 程序首先读取用户输入的4个整数到数组
arr
中。 while
循环控制了4次迭代,每次迭代中m
的值递减,分别对应数组中索引为3、2、1、0的元素。- 在每次
while
循环中,有三个嵌套的for
循环,它们分别遍历数组arr
中的元素,但会根据变量m
的值跳过一个特定的元素。 - 通过三层循环的嵌套,程序生成所有可能的三元组(三个不同的元素的组合),并检查这些组合中的元素是否互不相同。
- 如果三元组中的元素互不相同,则通过
printf
函数打印出来。
源代码
#include <stdio.h>
int main(void)
{
int arr[4];
for (int i = 0; i < 4; i++)
{
scanf("%d", &arr[i]);
}
int m = 3;
while (m >= 0)
{
for (int i = 0; i < 4; i++)
{
if (i == m)
continue;
for (int j = 0; j < 4; j++)
{
if (j == m)
continue;
for (int k = 0; k < 4; k++)
{
if (k == m)
continue;
if (i != j && i != k && j != k)
{
printf("%d %d %d \n", arr[i], arr[j], arr[k]);
}
}
}
}
m--;
}
return 0;
}