读书人

自己写的 帮忙看看 多谢了

发布时间: 2012-10-10 13:58:11 作者: rapoo

自己写的 帮忙看看 谢谢了
8.有15个数按由大到小的顺序存放在一个数组中,输入一个数,要求用折半查找法找出
该数是数组中第几个元素的值。如果该数不在数组中,则打印出"无此数"。

*************************************/
#include <stdio.h>
void main()
{
int m,left,right,mid,i;
int a[15]={20,19,18,17,16,15,14,10,9,8,5,4,3,2,1};
left=0;
right=15;

for(i=0;i<15;i++)
printf("%3d",a[i]);
printf("\n");
printf("输入一个数:");
scanf("%d",&m);
for(i=left;i<right;i++){
mid=(int)(left+right)/2;
if(a[mid]==m) {
printf("查找的数%d的第%d个元素\n",m,mid+1);
break;
}
if(m>a[mid])
right=mid;
else
left=mid+1;

if(m==a[i]){
printf("查找的数%d的第%d个元素",m,i+1);
break;
}
else
printf("无此数!");
}
}
输入:19
输出: 无此数!查找的数19是第2个元素
怎么把程序的结构在改进 改进 谢谢 指点了。

[解决办法]

C/C++ code
#include <stdio.h>int main(int argc, char* argv[]){    int left = 0, right = 15, mid;    int m, i;    int a[15] = {20, 19, 18, 17, 16, 15, 14, 10, 9, 8, 5, 4, 3, 2, 1};    for(i = 0; i < 15; i++)        printf("%3d", a[i]);    printf("\n");    printf("输入一个数:");    scanf("%d", &m);    for(i = left; i < right; i++)    {        mid = (int)(left + right) / 2;        if(a[mid] == m)        {            printf("查找的数%d的第%d个元素\n", m, mid + 1);            goto success;        }        if(a[mid] < m)            right = mid;        else            left = mid + 1;    }    printf("无此数!\n");success:    return 0;}
[解决办法]
C/C++ code
#include <stdio.h>void main(){    int m,left,right,mid,i;    int a[15]={20,19,18,17,16,15,14,10,9,8,5,4,3,2,1};    left=0;    right=15;    for(i=0;i<15;i++)        printf("%3d",a[i]);    printf("\n");    printf("输入一个数:");    scanf("%d",&m);    for(i=left;i<right;i++)    {        mid=(int)(left+right)/2;        if(a[mid]==m) {            printf("查找的数%d的第%d个元素\n",m,mid+1);            return;        }        if(m>a[mid])            right=mid;        else            left=mid;//left=mid+1好像不对;        if(m==a[i]){            printf("查找的数%d的第%d个元素",m,i+1);            break;        }        else            printf("无此数!");    }    return;}
[解决办法]
理清算法才是重要。。

读书人网 >C语言

热点推荐