自己写的 帮忙看看 谢谢了
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个元素
怎么把程序的结构在改进 改进 谢谢 指点了。
[解决办法]
#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;}
[解决办法]
#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;}
[解决办法]
理清算法才是重要。。