whileを使った探索です。昇順に整数を入力し、その中で5の位置(配列の添字)を出力したいのですが、うまく行きません。5が存在しない場合はー1を出力させるのですが、自分のプログラムだと5を入力してもー1が出てきます。main関数内が間違っていると思うのですが、どのように治せばいいのでしょうか。(初歩的なミスだと思います。。。)
#理想の実行結果
入力 1 2 3 4 5
出力 4
C++
1#include <iostream> 2#include <vector> 3using namespace std; 4 5int binary_search(vector<int>& numbers, int target, int low, int high){ 6 while(true){ 7 if(low>high) 8 return -1; 9 int mid=(low+high)/2; 10 if(numbers[mid]==target) 11 return mid; 12 if(numbers[mid]<target) 13 low=mid+1; 14 else 15 high=mid-1; 16 } 17} 18 19int binary_search(vector<int>& numbers, int target){ 20 return binary_search(numbers, target, 0, numbers.size()-1); 21} 22 23int main(void){ 24 vector<int> numbers; 25 int nums=0; 26 cin >> nums; 27 int idx=binary_search(numbers,5); 28 if (idx>=0) 29 cout << numbers[idx] << endl; 30 else 31 cout << "-1" << endl; 32 return 0; 33} 34
1.入力した数値(nums)は何処に格納するのですか?
2.数値(int)を入力くして、数字'5'を探しているのは何故でしょう?
1 それを考えていませんでした、、、配列を作ればいいのでしょうか。
2 課題の指示なので、特に理由はありません。
1.せっかく、vector使ってるんだからvectorに格納しましょう。
>課題の指示なので・・・数値を入力して文字を探すのですか?
・・・もし、そういう指示なら出題者に聞ましょう・・・“昇順に整数”とはなんですか?
また。2分検索にした理由はなんでしょう?
・・・関数名ダブってるし・・・まぁ。パラメータで分けられるけど・・・
蛇足:vectorのインデックスは'std::vector::size_type'です。
Binary Searchを使って数値を入力して特定の数字の位置を出力するプログラムを作るという課題です
数値と数字は違いますよ。'5'はASCIIで53(0x35)です、
これは失礼しました。入力するのは「数字」でした。
もう一つ、(配列の添字)と言っていますが、cout << numbers[idx] << endl;では見つかった文字を出力しています。
実行結果は添字になっていますね^^;
入力: 5 5 5 5 5 に対して 2を返すけど、それでいいのね?
> 入力するのは「数字」でした。
数字じゃないでしょ。「数値」でしょ。
会話をもう一度しっかり見直して、やっとお二方のおっしゃっていることがわかりました。「「数値」を昇順に入力して、「数値」の5の位置を探す」でした。しかし、(numbers,5)にしても結果は変わりませんでした。。。
“昇順に整数を入力”とありますから、入力: 5 5 5 5 5は違うのでは?
・・・最初に見つかった所、2が帰るのは間違いないです。
usr ~/Project/test % ./a.out
1 2 3 4 5 6
4
usr ~/Project/test % ./a.out
5 5 5 5 5
2
> “昇順に整数を入力”とありますから、入力: 5 5 5 5 5は違うのでは?
なんで? X[n] <= X[n+1] が成り立つなら昇順じゃないっけ?
昇順 →http://e-words.jp/w/%E6%98%87%E9%A0%86.html
残念ながら、X[n] <= X[n+1]かX[n] < X[n+1]か正確な定義は見つからなかったですが・・・
こちらは'<’を使っています→https://byjus.com/maths/ascending-order
「To represent this order of numbers, we need to use the ascending order symbol “<“」
X[n] < X[n+1] が昇順の必要条件だとすると
数列 1 2 3 3 4 5 6 は昇順でないことになる...直感に反するんよなー。
この問題では1 2 3 3 4 5 6もありだろうけど、1 2 3 4 5 5 6 はまずいと思う。
まぁ、出題者はそこまで考えてないと思うけど・・・・
回答4件
あなたの回答
tips
プレビュー