C語言經典例題一

  1..編程在一個已知的字符串中查找最長單詞,假定字符串中只含字母和空格,用空格來分隔單詞。

    char str[] = "Duke is Duck Frank is handsome";

    int length = 0;//存儲當前單詞的長度

    int maxLength = 0;//存儲最長單詞長度

    int maxIndex = 0;//存儲最長單詞開始的位置

    int i = 0;//循環變量初始化

    while (str[i] != '\0') {//遍歷字符

        if (str[i] != ' ') {

            //如果取到的不是空格

            length++;//單詞長度加1.

        } else {

            //獲取到的是空格的時候進行比較

            if (length > maxLength) {

                maxLength = length;

                maxIndex = i - length;//記錄單詞開始位置

            }

            length = 0;//將單詞長度清零, 計算新單詞長度

        }

        i++;//循環變量增量!!!!!!!!!!!!!!!!!!!!!

    }

    //如果最後一個單詞是最長單詞,不會遇到空格,則不會與Maxlength比較,所以我們只需要在循環外部比較一次即可.

    if (length > maxLength) {

        maxLength = length;

        maxIndex = i - length;

    }

    //

    for (int i = maxIndex; i < maxIndex + maxLength; i++) {

        printf("%c", str[i]);

    }

 

2.耶穌有13個門徒,其中有一個是出賣耶穌的叛徒, 請用排除法找出這位叛徒:13個人圍坐一圈,從第一個開始報數:1, 2,3,1,2,3......報數爲3的退出報數, 最後剩下的一位就是叛徒, 請確定誰是叛徒.

    //1.如何描述13個人?定義數組

    //2.如何報數?定義一個變量count記錄報數

    //3.一旦報數爲3,做什麼處理?

    //4.如何剔除一個人? 將該元素置0.

    //5.表示當前活着的人數? 定義變量number.

    //6.採用while循環(不知道循環多少次),循環條件number > 1.

    //7.如何循環報數? 如果 i 13,就轉到第一個人繼續報數.

    int a[13] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};

    int count = 0;

    int number = 13;

    int i = 0;

    while (number > 1) {

        if (a[i] != 0) {

            count++;

        }

        if (count == 3) {

            a[i] = 0;

            number--;

            count = 0;

        }

        i++;

        if (i == 13) {

            i = 0;

        }

    }

    //對數組遍歷, 找出活着的人

    for (int j = 0; j < 13; j++) {

        if (a[j] > 0) {

            printf("當前活着的人是%d", a[j]);

        }

    }


3.歸併排序.隨機生成十個元素兩個數組, 分別進行升序排序,然後將排完序的數組歸併的另外一個數組中

    int a[10] = {0};

    int b[10] = {0};

    //給a數組賦值[20-40]

    for (int i = 0; i < 10; i++) {

        a[i] = arc4random() % (40 - 20 + 1) + 20;

        printf("%d ", a[i]);

    }

    printf("\n");

//排序a

    for (int i = 0; i < 10 - 1; i++) {

        for (int j = 0; j < 10 - 1 - i; j++) {

            if (a[j] > a[j + 1]) {

                int temp = a[j];

                a[j] = a[j + 1];

                a[j + 1] = temp;

            }

        }

    }

    printf("\n");

    for (int i = 0; i < 10; i++) {

        printf("%d ", a[i]);

    }

    printf("\n");

//b數組賦值

    for (int i = 0; i < 10; i++) {

        b[i] = arc4random() % (40 - 20 + 1) + 20;

        printf("%d ", b[i]);

    }

    printf("\n");

//b數組排序

    for (int i = 0; i < 10 - 1; i++) {

        for (int j = 0; j < 10 - 1 - i; j++) {

            if (b[j] > b[j + 1]) {

                int temp1 = b[j];

                b[j] = b[j + 1];

                b[j + 1] = temp1;

            }

        }

    }

    printf("\n");

    for (int i = 0; i < 10; i++) {

        printf("%d ", b[i]);

    }

    printf("\n");

//合併的數組c中

    int i = 0;//標示數組 a 中元素的下標

    int j = 0;//標示數組 b 中元素的下標

    int c[20] = {0};

    int k = 0;//標示數組 c 中元素的下標

    while (i < 10 && j < 10) {

        //此時,數組A與數組B都沒有完全放入數組C

        if (a[i] > b[j]) {

            c[k] = b[j];

             k++;

             j++;

        }else {

            c[k++] = a[i++];

        }

    }

    //假設A中元素沒有放入完畢

    while (i < 10) {

        c[k++] = a[i++];//將數組A中剩餘的元素放入數組C中

    }

    //假設B中元素沒有放入完畢

    while (j < 10) {

        c[k++] = b[j++];//將數組B中剩餘的元素放入數組C中

    }

//輸出數組c

    for (int k = 0; k < 20; k++) {

        printf("%d ", c[k]);

    }

    4.有1000000個數,每個數取值範圍都是0~999999. 找出重複的數,以及重複的次數.

//分析:數的取值範圍與數組中元素的個數的下標數字相對應, 隨機下標,下標重複的次數就是對應數重複的次數.先以10爲例

    int a[10] = {0};//0~9取值範圍

    int ran = 0;//接收每次的隨機值

    for (int i = 0; i < 10; i++) {

        ran = arc4random() % 10;//隨機下標

        a[ran]++;//將下標對應的元素值加1

    }

    printf("\n");

    for (int i = 0; i < 10; i++) {

        if (a[i] > 1) {

            printf("%d 重複 %d次\n", i, a[i]);

        }

    }

//以此類推


//當範圍是[10-19]

    int a[10] = {0};//0~9取值範圍

    int ran = 0;//接收每次的隨機值

    for (int i = 0; i < 10; i++) {

        ran = arc4random() % (19 - 10 + 1) + 10;//隨機下標

        printf("%d ", ran);

        a[ran - 10]++;//將下標對應的元素值加1

    }

    printf("\n");

    for (int i = 0; i < 10; i++) {

        if (a[i] > 1) {

            printf("%d 重複 %d\n", i + 10, a[i]);

        }

    }

//範圍是[17-19] 10個數

    int a[3] = {0};

    int ran = 0;

    for (int i = 0; i < 10; i++) {

        ran = arc4random() % (19 - 17 + 1) + 17;

        printf("%d ", ran);

        a[ran - 17]++;

    }

    printf("\n");

    for (int i = 0; i < 3; i++) {

        if (a[i] > 1) {

            printf("%d 出現 %d\n", i + 17, a[i]);

        }

    }


//[30-50]  20個數

    int a[21] = {0};

    int ran = 0;

    for (int i = 0; i < 20; i++) {

        ran = arc4random() % (50 - 30 + 1) + 30;

        printf("%d ", ran);

        a[ran - 30]++;

    }

    printf("\n");

    for (int i = 0; i < 21; i++) {

        if (a[i] > 1) {

            printf("%d 出現 %d\n", i + 30, a[i]);

        }

    }

5.隨機生成一個三維數組,編程求深度的平均值,保存在一個二維數組中
    /*
    int a[3][4][3] = {0};
    for (int i = 0; i < 3; i++) {
        printf("------------第%d層-----------\n", i + 1);
        for (int j = 0; j < 4; j++) {
            for (int k = 0; k < 3; k++) {
                a[i][j][k] = arc4random() % (40 - 20 + 1) + 20;
                printf("%d ", a[i][j][k]);
            }
            printf("\n");
        }
        printf("\n");
    }
    int b[4][3] = {0};
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 3; k++) {
                b[i][j] += a[k][i][j];
            }
            printf("%.2f ", b[i][j] * 1.0 / 3);
        }
        printf("\n");

    }

6.找出一個二維數組中的“鞍點”,即該位置上的元素在該行中最大,在該列中最小(也可能沒鞍點),打印出有關信息。

    int a[3][4] = {0};

    for (int i = 0; i < 3; i++) {

        for (int j = 0; j < 4; j++) {

            a[i][j] = 1;//arc4random() % (40 - 20 + 1) + 20;

            printf("%d ", a[i][j]);

        }

        printf("\n");

    }

    //遍歷數組中的每個元素,驗證每個元素是否是鞍點.

    int count = 0; //用來記錄鞍點的個數

    for (int i = 0; i < 3; i++) {

        for (int j = 0; j < 4; j++) {

            //首先假定該數是該行中最大的

            BOOL isMax = YES;

            //驗證該數是否是該行中最大的

            for (int column = 0; column < 4; column++) {

                if (a[i][column] > a[i][j]) {

                    isMax = NO; //如果不是最大的, 將isMax標識爲NO.

                    break; //結束當前循環

                }

            }

           

            if (isMax == NO) {

                //如果爲NO,說明不是該行中最大的,已經不滿足鞍點的條件了.

                continue; //直接進入下一循環

            }

            //先假設是該列中最小的.

            BOOL isMin = YES;

            //驗證該數是否是該列中最小的.

            for (int row = 0; row < 3; row++) {

                if (a[row][j] < a[i][j]) {

                    isMin = NO;

                    break;

                }

            }

            if (isMin == NO) {

                continue;

            }

            count++;

            printf("row:%d,column:%d = %d\n", i + 1, j + 1, a[i][j]);

        }

    }

    if (count == 0) {

        printf("沒有鞍點");

    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章