冷回清风暖 发表于 2020-8-22 16:28:54

顺序表练习题

本帖最后由 冷回清风暖 于 2020-8-22 16:49 编辑

题干:
数组A = (a1,a2,a3,.......)
数组B = (b1,b2,b3,.......)

先去除数组最大公共前缀,如A = (a,b,c,r,d), B = (a,b,l,o,r),则最大公共前缀为(a,b,c)
去除最大公共前缀后的连个数组为 :A1 = (r,d)   B1 = (l,o,r)
如果A1 = B1 = 空表 ,则A = B。
若A1 = 空表 且 B1 = 空表,或两者均不为空且A1的第一个元素小于B1的第一个元素值,则A<B,否则A>B.

实现代码:

#include<stdio.h>
#define min 0.000000001

int compare(float A[], int An, float B[], int Bn)
{
        int i = 0;
        while (i < An && i < Bn)//过滤公共前缀
        {
                if (abs(A - B) < min)//min是一个已定义的足够小的数
                        ++i;
                else break;
        }
        if (i >= An && i >= Bn)//A和B都为空
                return 0;
        else if ((i >= An && i < Bn) || A < B)
                return -1;
        else
                return 1;

}

int main(void)
{
        int result;
        float a[] = { 0.1, 0.2, 0.3, 0.4 ,0.3};
        float b[] = { 0.1, 0.2, 0.3, 0.4 };
        result = compare(a, 4, b, 5);
        printf("%d\n",result);
        return 0;
}

        else if ((i >= An && i < Bn) || A < B)
这行代码好像没有体现出来 “两者均不为空” 只体现出来了 “两者均不为空且A1的第一个元素小于B1的第一个元素值”
但这是参考答案 ,看了好就没看出来{:5_104:}

sunrise085 发表于 2020-8-22 16:50:32

if (i >= An && i >= Bn)//A和B都为空
这个是AB都为空

else if ((i >= An && i < Bn) || A < B)
这个是A为空B不为空或者AB都不为空,但A[i] < B[i]

最后的else,是其他情况,即A不为空但B为空,或者AB都不为空但A[i] > B[i]

冷回清风暖 发表于 2020-8-22 17:02:11

sunrise085 发表于 2020-8-22 16:50
这个是AB都为空




        else if ((i >= An && i < Bn) || A < B)
这一句里面 是怎么体现出来 A不为空且B不会空的
(i >= An && i < Bn)
这个是A为空且B不为空
后面A < B
好像没体现出来A不为空 且 B 不为空 直接判断的值的大小
想了好久了{:5_104:}

sunrise085 发表于 2020-8-22 18:33:10

冷回清风暖 发表于 2020-8-22 17:02
这一句里面 是怎么体现出来 A不为空且B不会空的

这个是A为空且B不为空


不好意思,看错了。程序的确有问题。不但15行有问题,27行也有问题。数组a和b的长度4和5写反位置了
#include<stdio.h>
#include<math.h>
#define min 0.000000001
int compare(float A[], int An, float B[], int Bn)
{
    int i = 0;
    while (i < An && i < Bn)//过滤公共前缀
    {
      if (fabs(A - B) < min)//min是一个已定义的足够小的数
            ++i;
      else break;
    }
    if (i >= An && i >= Bn)//A和B都为空
      return 0;
    else if ((i >= An && i < Bn) || (i < An && i < Bn &&A < B))
      return -1;
    else
      return 1;
}


int main(void)
{
    int result;
    float a[] = { 0.1, 0.2, 0.3, 0.4 ,0.03};
    float b[] = { 0.1, 0.2, 0.3, 0.4 };
    result = compare(a, 5, b, 4);
    printf("%d\n",result);
    return 0;
}

405794672 发表于 2020-8-22 19:52:46

你判定的最大公共前辍的依据是什么?你举的例子不符合我对语言的理解
页: [1]
查看完整版本: 顺序表练习题