鱼C论坛

 找回密码
 立即注册
查看: 1154|回复: 4

[已解决]顺序表练习题

[复制链接]
发表于 2020-8-22 16:28:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冷回清风暖 于 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.

实现代码:

  1. #include<stdio.h>
  2. #define min 0.000000001

  3. int compare(float A[], int An, float B[], int Bn)
  4. {
  5.         int i = 0;
  6.         while (i < An && i < Bn)//过滤公共前缀
  7.         {
  8.                 if (abs(A[i] - B[i]) < min)//min是一个已定义的足够小的数
  9.                         ++i;
  10.                 else break;
  11.         }
  12.         if (i >= An && i >= Bn)//A和B都为空
  13.                 return 0;
  14.         else if ((i >= An && i < Bn) || A[i] < B[i])
  15.                 return -1;
  16.         else
  17.                 return 1;

  18. }

  19. int main(void)
  20. {
  21.         int result;
  22.         float a[] = { 0.1, 0.2, 0.3, 0.4 ,0.3};
  23.         float b[] = { 0.1, 0.2, 0.3, 0.4 };
  24.         result = compare(a, 4, b, 5);
  25.         printf("%d\n",result);
  26.         return 0;
  27. }
复制代码

  1.         else if ((i >= An && i < Bn) || A[i] < B[i])
复制代码

这行代码好像没有体现出来 “两者均不为空” 只体现出来了 “两者均不为空且A1的第一个元素小于B1的第一个元素值”
但这是参考答案 ,看了好就没看出来
最佳答案
2020-8-22 18:33:10
冷回清风暖 发表于 2020-8-22 17:02
这一句里面 是怎么体现出来 A不为空且B不会空的

这个是A为空且B不为空


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


  20. int main(void)
  21. {
  22.     int result;
  23.     float a[] = { 0.1, 0.2, 0.3, 0.4 ,0.03};
  24.     float b[] = { 0.1, 0.2, 0.3, 0.4 };
  25.     result = compare(a, 5, b, 4);
  26.     printf("%d\n",result);
  27.     return 0;
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-22 16:50:32 | 显示全部楼层
  1. if (i >= An && i >= Bn)//A和B都为空
复制代码

这个是AB都为空

  1. else if ((i >= An && i < Bn) || A[i] < B[i])
复制代码

这个是A为空B不为空或者AB都不为空,但A[i] < B[i]

最后的else,是其他情况,即A不为空但B为空,或者AB都不为空但A[i] > B[i]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-22 17:02:11 | 显示全部楼层

  1.         else if ((i >= An && i < Bn) || A[i] < B[i])
复制代码

这一句里面 是怎么体现出来 A不为空且B不会空的
  1. (i >= An && i < Bn)
复制代码

这个是A为空且B不为空
后面
  1. A[i] < B[i]
复制代码

好像没体现出来A不为空 且 B 不为空 直接判断的值的大小
想了好久了

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-22 18:33:10 | 显示全部楼层    本楼为最佳答案   
冷回清风暖 发表于 2020-8-22 17:02
这一句里面 是怎么体现出来 A不为空且B不会空的

这个是A为空且B不为空


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


  20. int main(void)
  21. {
  22.     int result;
  23.     float a[] = { 0.1, 0.2, 0.3, 0.4 ,0.03};
  24.     float b[] = { 0.1, 0.2, 0.3, 0.4 };
  25.     result = compare(a, 5, b, 4);
  26.     printf("%d\n",result);
  27.     return 0;
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-22 19:52:46 | 显示全部楼层
你判定的最大公共前辍的依据是什么?你举的例子不符合我对语言的理解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 03:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表