题目要求
利用二分查找找出所给出的数在数组中的下标
输入格式:
第一行输入n和m表示数组有n个数据,m表示要对m个数进行查找
输出格式:
所有输出在一行完成,行末没有多余空格和多余回车。
输入样例:
5 5
1 2 3 4 5
1 2 3 4 5
输出样例:
0 1 2 3 4
代码
#include<iostream>
using namespace std;
int chazhao(int c[],int m,int n)
{
int start = 0,end;//sizeof的值就为c[n]中的n,并不是c实际的数字个数 ,原因是数组作为参数传给函数时,是传给数组的地址,而不是传给整个的数组空间
//end = sizeof(c)/sizeof(int)-1;
end=m-1;
while(start<=end){
int mid = (end + start)/2;
if(n<c[mid]){
end=mid-1;
}
if(n>c[mid]){
start=mid+1;
}
if(n==c[mid]){
return mid;
}
}
return 0;
}
int main(){
int n,m;
cin >> n >> m;
int a[n],b[m],c[m];
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<m;i++){
cin>>b[i];
c[i]=chazhao(a,n,b[i]);//数组直接为a就行了,不用a[] !
}
for(int i=0;i<m-1;i++){
cout<<c[i]<<" ";
}
cout<<c[m-1];
}
好久好久都没有写过博客了,嗯,如果要是算真正用心去写的话,这是第一次,之前都是复制题目然后答案,并没有用心写过。也是希望改变一下自己吧,今后会坚持去写一些心得和体会,也希望自己能够从这一点一滴的记录中得到成长和蜕变吧。
通过做这道题还是暴露出太多问题了,从最基本的语法问题,都已经忘得差不多了,本来C语言基础就不是特别好,现在做C++还是稍微有一点吃力的。虽然吃力,也要去努力学习去补上之前的坑,这怪不得别人,谁叫你之前没学好呢。请加油!!!
这是通过做这道题发现的问题,与君共勉
本来自定义函数为
int chazhao(int c[],int n)
,想法是通过sizeof求得数组c[]中的元素个数,但却发现并行不通,因为sizeof函数的含义为数组所占字节数,并不是实际数组中的元素个数,求数组中元素个数应该用
sizeof©/sizeof(int)-1
,通过总的字节数除以每个元素所占的字节数就是元素个数了
因为函数
chazhao
的返回值为整型,而return只在while语句中返回了mid,在提交的时候报错
warning: control reaches end of non-void function
,这是因为部分函数没有返回值,所以报错,于是在自定义函数最后放上了一个 return 0;问题完美解决。在有返回值函数中,无论最后的return是否能够用的上,一定要加上不能遗漏。
还有就是一个特别基础的问题了,在主函数中调用函数的时候,数组作为变量,是直接输入a就行了,不用输入方括号!!
做这个题一共用了我好几个钟,从昨天晚上10点开始到到十一点多,再到今天早起九点多(因为今天过星期,好久没有睡得这么爽了,又开心又舒服)到现在,这足以证明我是多么的菜了。请叫我小菜鸡!!!
虽然很菜,但当最后一溜
答案正确
的时候还是超级开心的,有图有真相
好,今天就先到这里了,我会继续坚持写博客的,而且是用心去写,加油。