我正在尝试用 C 编写程序
给定三个唯一的非负int类型数字的输入,程序应该对它们进行排序并按升序排序输出它们。对于这个程序,只允许基本的数学结构。( +, -, /, *, %)
输入示例为:
输入三个整数:32 29 21
然后,示例输出应该是:
排序号码:21 29 31
明确不允许使用逻辑运算符,如和> <以及==选择语句。if forswitch
我正在尝试用 C 编写程序
给定三个唯一的非负int类型数字的输入,程序应该对它们进行排序并按升序排序输出它们。对于这个程序,只允许基本的数学结构。( +, -, /, *, %)
输入示例为:
输入三个整数:32 29 21
然后,示例输出应该是:
排序号码:21 29 31
明确不允许使用逻辑运算符,如和> <以及==选择语句。if forswitch
这有点棘手。仅使用“数学”算术函数,我认为这是不可能的(即对实数使用真正的数学运算符)。
但是,幸运的是,这是 C 语言,我们有整数除法之类的整数运算。整数除法具有a/b == 0ifa<b和a/b > 0if的有用属性a>b。我们可以利用它编写一个min函数,从您输入的两个中返回较小的数字:
unsigned math_min(unsigned a, unsigned b) {
a++; b++; // ensure neither a nor b is zero
unsigned c = ((a/b)*b + (b/a)*a) / ((a/b) + (b/a));
return c-1; // correct for earlier increment
}
这通过计算a/b*b和b/a*a. 如果我们假设a并且b彼此不同并且是正的,那么其中恰好有一个将是非零的 - 对应于较小值的那个。(事实上,即使a==b在这种情况下我们加a+b和除以二,这个函数也可以工作)。
使用这个“仅数学”min功能,您应该能够实现排序操作;这留作练习。