-6

我正在尝试用 C 编写程序

给定三个唯一的非负int类型数字的输入,程序应该对它们进行排序并按升序排序输出它们。对于这个程序,只允许基本的数学结构。( +, -, /, *, %)

输入示例为:

输入三个整数:32 29 21

然后,示例输出应该是:

排序号码:21 29 31

明确不允许使用逻辑运算符,如和> <以及==选择语句。if forswitch

4

1 回答 1

8

这有点棘手。仅使用“数学”算术函数,我认为这是不可能的(即对实数使用真正的数学运算符)。

但是,幸运的是,这是 C 语言,我们有整数除法之类的整数运算。整数除法具有a/b == 0ifa<ba/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*bb/a*a. 如果我们假设a并且b彼此不同并且是正的,那么其中恰好有一个将是非零的 - 对应于较小值的那个。(事实上​​,即使a==b在这种情况下我们加a+b和除以二,这个函数也可以工作)。

使用这个“仅数学”min功能,您应该能够实现排序操作;这留作练习。

于 2016-02-03T08:47:54.363 回答