| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2949 人关注过本帖
标题:用折半法查找数据
只看楼主 加入收藏
terry6677
Rank: 1
等 级:新手上路
帖 子:45
专家分:5
注 册:2015-6-29
结帖率:80%
收藏
已结贴  问题点数:20 回复次数:13 
用折半法查找数据
题目是15个以排好序的数,新输入一个数,用折半法查找。

我有两个问题:1、输入的数字在区间范围但是不是里面某一个数的时候,会陷入死循环,怎么样子让它输出“这个数不存在”?
              2、最后输入Y/N时,为什么我不能输入。
#include <stdio.h>
#define N 15
main()
{
    int s[N] = { 14,25,36,47,58,69,147,258,369,74,85,96,741,852,963}, i, j, temp, n;
    int top, bottle, mid, sign;
    char c;
 
    for ( i = 1; i < N; i++ )
        for ( j = 0; j < N - i; j++ )
            if ( s[j] < s[j + 1] )
            {   
                temp = s[j];
                s[j] = s[j + 1];
                s[j + 1] = temp;
            }
    for ( i = 0; i < N; i++ )
        printf ("%d  ",s[i]);

    while ( 1 )
    {
        printf ("input a number:");
        scanf ("%d",&n);
        top = 1;
        bottle = N;
        sign = 1;
        while ( sign == 1 )
        {
            mid = ( top + bottle ) / 2;   
            if ( n > s[0] || n < s[N - 1] )
            {
                printf ("the number is not exist");
                sign = 0;
            }
            else
                if ( n == s[mid] )
                {
                    printf ("%d 's number is s[%d]\n",n,mid);
                    break;
                }
                else
                    if ( n > s[mid] )
                        bottle = mid - 1;
                    else
                        if ( n < s[mid] )
                            top = mid + 1;
        }
        printf ("continue? Y/N");
        scanf ("%c",&c);
        if ( c == 'n' || c == 'N' )
            break;
    }
}



   

        







搜索更多相关主题的帖子: include bottle 
2015-11-11 22:19
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:4 
top等于bottom时终止

一片落叶掉进了回忆的流年。
2015-11-11 23:27
terry6677
Rank: 1
等 级:新手上路
帖 子:45
专家分:5
注 册:2015-6-29
收藏
得分:0 
回复 2楼 诸葛欧阳
谢谢,好了。
请问为什么最后我不能输入y/n?
2015-11-12 08:28
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9032
专家分:54066
注 册:2011-1-18
收藏
得分:4 
回复 3楼 terry6677
可能是输入数据时遗留的回车符
2015-11-12 09:11
terry6677
Rank: 1
等 级:新手上路
帖 子:45
专家分:5
注 册:2015-6-29
收藏
得分:0 
回复 4楼 rjsp
应该怎么操作呢?
2015-11-12 15:15
柳逸尘
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:131
注 册:2015-8-10
收藏
得分:4 
折半查找是一个顺序列表(里面的数据是从小到大或者从大到小的顺序)。
2015-11-12 15:53
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9032
专家分:54066
注 册:2011-1-18
收藏
得分:0 
以下是引用terry6677在2015-11-12 15:15:13的发言:

应该怎么操作呢?
scanf ("%c",&c);
改为
scanf (" %c",&c);
试试
2015-11-12 16:14
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:4 
简单解决办法是scanf("%c%c",&c,&c);

能编个毛线衣吗?
2015-11-12 16:22
孤狼A组
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:73
专家分:121
注 册:2015-9-8
收藏
得分:4 
给你改了,不知道符不符合
#include <stdio.h>
#define N 15
 main()
 {
     int s[N] = {14,25,36,47,58,69,147,258,369,74,85,96,741,852,963}, i, j, temp, n,a=1;
     int top, bottle, mid, sign;
     char c;

     for ( i = 1; i < N; i++ )
         for ( j = 0; j < N - i; j++ )
             if ( s[j] < s[j + 1] )
             {   
                 temp = s[j];
                 s[j] = s[j + 1];
                 s[j + 1] = temp;
             }
     for ( i = 0; i < N; i++ )
         printf ("%d  ",s[i]);
         printf("\n");


    while (a)
     {
         printf ("input a number:");
         scanf ("%d",&n);
         top = 1;
         bottle = N;
         sign = 1;
         while ( sign == 1 )
         {
             mid = ( top + bottle ) / 2;   
             if ( n > s[0] || n < s[N - 1] )
             {
                 printf ("the number is not exist");
                 sign = 0;
             }
             /*else if ( n == s[mid] )
                 {
                     printf ("%d 's number is s[%d]\n",n,mid);
                     break;
                 }
                 else if ( n > s[mid] )
                         bottle = mid - 1;
                     else if ( n < s[mid] )
                             top = mid + 1;*/
             if(n>s[mid])
             { bottle=mid;
             mid=(top+bottle)/2;
             if(n==s[mid]) { printf ("%d 's number is s[%d]\n",n,mid);
                             break;}
               else if(top==bottle) exit(0);
             }
             if(n<s[mid])
             {     top=mid;
                 mid=(top+bottle)/2;
                 if(n==s[mid]) { printf ("%d 's number is s[%d]\n",n,mid);
                             break;}
                 else if(top==bottle) exit(0);
             }
         }
        
         printf ("continue? 1/0:   ");
         scanf ("%d",&a);
         
            
     }
 }
2015-11-12 21:19
孤狼A组
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:73
专家分:121
注 册:2015-9-8
收藏
得分:0 
  963找不出来
2015-11-12 21:25
快速回复:用折半法查找数据
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028626 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved