我正在尝试用 C 编写程序
给定三个唯一的非负int
类型数字的输入,程序应该对它们进行排序并按升序排序输出它们。对于这个程序,只允许基本的数学结构。( +
, -
, /
, *
, %
)
输入示例为:
输入三个整数:32 29 21
然后,示例输出应该是:
排序号码:21 29 31
明确不允许使用逻辑运算符,如和>
<
以及==
选择语句。if
for
switch
我正在尝试用 C 编写程序
给定三个唯一的非负int
类型数字的输入,程序应该对它们进行排序并按升序排序输出它们。对于这个程序,只允许基本的数学结构。( +
, -
, /
, *
, %
)
输入示例为:
输入三个整数:32 29 21
然后,示例输出应该是:
排序号码:21 29 31
明确不允许使用逻辑运算符,如和>
<
以及==
选择语句。if
for
switch
这有点棘手。仅使用“数学”算术函数,我认为这是不可能的(即对实数使用真正的数学运算符)。
但是,幸运的是,这是 C 语言,我们有整数除法之类的整数运算。整数除法具有a/b == 0
ifa<b
和a/b > 0
if的有用属性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
功能,您应该能够实现排序操作;这留作练习。