标题:大家帮忙看下以下的这段代码有什么问题!!!我编译了下 没语法错误 但执行 ...
只看楼主
查明
Rank: 2
等 级:论坛游民
帖 子:31
专家分:24
注 册:2011-4-12
得分:0 
回复 7楼 autumn2779
我想scanf是没有问题的
我在听取大家的意见后直接对v[N]进行初始化也没用
#include"stdio.h"

#define N 10

main()
{
  int i, x, low, high, mid;
  int v[N] = {2,3,4,5,6,7,8,9,10,11};

  x = 10;
  //printf("please input the numbers.\n");
  //for(i=0; i<N; i++)
  //    scanf("%d", v);
  high = N - 1;
  low = 0;

  while(high >= low)
  {
    mid = (high + low) / 2;
    if(x > v[mid])
      low = mid + 1;
    else if(x < v[mid])
      high = mid - 1;
    else
      printf("%d", mid);
    break ;//此处我听取大家意见加了break

  }
  
     
}
2011-05-15 16:30
shalyf
Rank: 2
等 级:论坛游民
帖 子:21
专家分:18
注 册:2011-5-12
得分:3 
程序代码:
#include"stdio.h"
#define N 10
void main()
{
    int i, x, low, high, mid;
    int v[N];
    x = 10;
    printf("please input the numbers.\n");//二分查找需要先排序
    for(i=0; i<N; i++)//这里必须默认输入的数字是从小到大排序的,否则要排序
        scanf("%d",&v[i]);
    high = N - 1;
    low = 0;
    while(high >= low)
    {
        mid = (high + low) / 2;
        if(x > v[mid])
            low = mid;
        else if(x < v[mid])
            high = mid;
        else{
            printf("%d", mid);
            break;
        }
        if(mid = N-2){
            if(v[N-1]==10){
                printf("%d", N-1);
                break;
            }
        }
    }
} 
2011-05-15 16:48
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
得分:1 
程序代码:
  while(high >= low) {
    mid = (high + low) / 2;
    if(x > v[mid]) low = mid + 1;
    else if(x < v[mid]) high = mid - 1;
    else{
        printf("%d", mid);
        return 0;
    }
  }
    printf("No Found\n");
    return 0;

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-05-15 16:49
查明
Rank: 2
等 级:论坛游民
帖 子:31
专家分:24
注 册:2011-4-12
得分:0 
回复 12楼 shalyf
我知道折半法要排序 我在读入时是按从小到大输入的
2011-05-15 17:14
shalyf
Rank: 2
等 级:论坛游民
帖 子:21
专家分:18
注 册:2011-5-12
得分:0 
回复 14楼 查明
我改的那段代码是可以的,你可以参考参考
2011-05-15 17:40
shalyf
Rank: 2
等 级:论坛游民
帖 子:21
专家分:18
注 册:2011-5-12
得分:1 
回复 14楼 查明
我觉得折半最好不要把mid再+1||-1,那样势必会跳过某个数字,比如你原来那个程序,v[3]是会被跳过的,如果10就在这里的话,你的代码就完了
2011-05-15 17:45
霖海听涛
Rank: 2
等 级:论坛游民
帖 子:16
专家分:22
注 册:2010-7-18
得分:2 
#include"stdio.h"

 #define N 10

 main()
 {
   int i, x, low, high, mid;
   int v[N] ;

   x = 10;
   printf("please input the numbers.\n");
   for(i=0; i<N; i++)
     scanf("%d", &v[i]);
   high = N - 1;
   low = 0;

   while(high >= low)
   {
     mid = (high + low) / 2;
     if(x > v[mid])
       low = mid + 1;
     else if(x < v[mid])
       high = mid - 1;
     else
       {
         printf("%d", mid);
          break ;
        }

   }


注意把break 括入到else中,不然会循环不起来的。
还有注意scanf
   
      
 }

[ 本帖最后由 霖海听涛 于 2011-5-15 18:16 编辑 ]
2011-05-15 18:10
查明
Rank: 2
等 级:论坛游民
帖 子:31
专家分:24
注 册:2011-4-12
得分:0 
回复 15楼 shalyf
我编译执行了下你的代码 嗯 是能得到正确结果 谢谢哈
2011-05-15 21:02
查明
Rank: 2
等 级:论坛游民
帖 子:31
专家分:24
注 册:2011-4-12
得分:0 
回复 16楼 shalyf
嗯 知道了!!! 谢谢提醒!!!
2011-05-15 21:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-339956-1-1.html




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

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