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("没有鞍点");

    }


你可能感兴趣的:(C语言,归并排序,耶稣门徒)