1. 程式人生 > 實用技巧 >C語言--折半查詢

C語言--折半查詢

C語言--折半查詢

題目描述:

給定N個整數和K個待查詢的整數M1,M2,...,MK。如果待查詢的整數在給定的N個整數中,請輸出待查詢的整數是陣列中的第幾個元素(從1開始計算,第一個元素計算1而不是0);如果待查詢的整數不在給定的N個整數中,則輸出0。

輸入格式:

輸入包括三行,第一行輸入兩個整數N(1<=N<=10^6)和K(1 <= K <= 10^),分別表示給定的整數總個數和待查詢的數的個數;第二行自小到大輸入N個整數Number i (1 <= Number i <= 10^6,其中1 <= i <= N),每兩個整數之間用一個空格隔開,第三行輸入K個整數 Number i (1 <= Number i <= 10^6,其中 1 <= j <= K),每兩個整數之間用一個空格隔開。

輸出格式;

輸出為一行,包括K個部分,每個部分為題目描述中待查詢的元素索引或0K個部分之間用一個空格分隔。輸出行尾不含多餘空格。

樣例輸入1:

3 1
1 4 6
4

樣例輸出1:

2

樣例輸入2;

5 2
1 4 6 7 8
5 1

樣例輸出2:

0 1

樣例輸入3:

6 4
1 2 4 6 7 8
9 1 5 2

樣例輸出3:

0 1 0 2

程式碼:

#include <stdio.h>

int main() {
    int n;
    int k;
    int numbers[1000001];
    int m;
    int i;
    int j;

    // 反覆讀入數字和查詢數字的數量
while (scanf("%d%d", &n, &k) != EOF) { // 讀入給定的數字 for (i = 0; i < n; i++) { scanf("%d", &numbers[i]); } for (j = 0; j < k; j++) { // 讀入待查詢的數字, scanf("%d", &m); // 請在下面完成查詢讀入數字的功能 int
target = 1; i = 0; int num = n; while(target) { if(m < numbers[(i + num) / 2]) { num = (i + num) / 2; } else if(m > numbers[(i + num) / 2]) { i = (i + num) / 2; } if(m == numbers[(i + num) / 2]) { printf("%d", (i + num) / 2 +1); break; } else if(num - i == 1) // 判斷被查詢數不在陣列中 { printf("%d", 0); break; } } if(j+1 == k || printf(" ")) { } } } return 0; }