c语言用二维数组查找负数,[抄道题] 在二维数组中找某数

得分:20

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

根据行列递增的特点,逐步缩小范围,首先在首行和首列中查找小于或等于查找值的行或列,舍去大的部分,再在尾行和尾列中查找大于或等于查找值的行或列,舍去小的部分,循环处理,直到剩下一个元素,比对。

#include

int data[5][6] =

{

{1,   4,  7, 11, 15,25},

{2,   5,  8, 12, 19,28},

{3,   6,  9, 16, 22,31},

{10, 13, 14, 17, 24,32},

{18, 21, 23, 26, 30,39}

};

int   m=5,n=6;

int main()

{

int x;

int f(int);

while(x!=-1)

{

scanf("%d",&x);

printf("%s\n",(f(x)==1)?"true":"false");

}

}

int f(int x)

{

int si,sj,ei,ej;

int s,e,k;

si=0;

sj=0;

ei=m-1;

ej=n-1;

while((ei-si>0)|(ej-sj>0))

{

if(data[si][sj]>x) return 0;

//用二分查找在首行中查找<=x的列号

s=sj;

e=ej;

if(data[si][e]<=x) s=e;

while(e-s>1)

{

k=s+(e-s)/2;

if (data[si][k]>x) e=k;

else s=k;

}

ej=s;//更改尾列下标,缩小范围

//用二分查找在首列中查找<=x的行号

s=si;

e=ei;

if(data[e][sj]<=x) s=e;

while(e-s>1)

{

k=s+(e-s)/2;

if (data[k][sj]>x) e=k;

else s=k;

}

ei=s;//更改尾行下标,缩小范围

if(data[ei][ej]

//用二分查找在尾行中查找>=x的列号

s=sj;

e=ej;

if(data[ei][s]>=x) e=s;

while(e-s>1)

{

k=s+(e-s)/2;

if (data[ei][k]

else e=k;

}

sj=e;//更改首列下标,缩小范围

//用二分查找在尾列中查找>=x的行号

s=si;

e=ei;

if(data[s][ej]>=x) e=s;

while(e-s>1)

{

k=s+(e-s)/2;

if (data[k][ej]

else e=k;

}

si=e;//更改首行下标,缩小范围

}

return data[si][sj]==x;//此时si=sj,ei=ej

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值