Educoder-程序设计基础:一维数组和二维数组

第1关:查找整数

​ 题目描述:给出一个包含n个整数的数列,问整数a在数列中的第一次出现的位置是多少(从1开始)

#include<stdio.h>
int main(void)
{
    /*********Begin*********/
    int a[1000];
    int i, n, b, p;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    scanf("%d", &b);
    for (i = 0; i < n; i++)
    {
        if (a[i] == b)
        {
            p = i + 1;
            break;
        }
    }
    if (n == i)
        printf("-1");
    else
        printf("%d", p);
    /*********End**********/
    return 0;
}

第2关:简单加密

​ 本关任务:在网络传递数据过程中为安全考虑要为数据进行加密 ,假定数据是四位的整数,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。用户输入一个四位的整数,输出加密后的密文

#include <stdio.h>
int main() {
    /*********begin *******/
    int a[5], i, j, m, n;
    scanf("%d", &m);
    for (i = 0; i <= 3; i++)
    {
        a[i] = m % 10;      //分离四个数
        m = m / 10;
        a[i] = (a[i] + 5) % 10;
    }

    n = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];
    printf("%d", n);
    /*********end *******/
    return 0;
}

第3关:排序问题

​ 本关任务:将十个数进行从大到小的顺序进行排列

#include<stdio.h>
int main(void)
{
    /*********Begin*********/
    int a[100], i, j, t;
    for (i = 0; i < 10; i++) {
        scanf("%d", &a[i]);
    }
    for (i = 0; i < 9; i++) {   //最后一位在第9位已经比完了
        for (j = 0; j < 9; j++) {
            if (a[j] < a[j + 1]) {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }
    for (i = 0; i < 10; i++) {
        printf("%d", a[i]);
    }
    /*********End**********/
    return 0;
}

第4关:二分查找

输入 输入包括3行,第一行为整数n(元素个数),第二行包括n个整数(数组元素),以空格分隔,第三行为整数m(要查找的元素)。

输出 如果能够在序列中找到整数m,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None

#include<stdio.h>
int main() {
	int a[100], key, index = -1, high, low, mid, i, m;
	scanf("%d", &m);
	for (i = 0; i < m; i++) {
		scanf("%d", &a[i]);
	}
	scanf("%d", &key);
	low = 0; high = key-1;
	while (low <= high) {	//目的是防止数组中没有查找的元素,如果没有需要的元素最终low会大于high
		mid = (low + high) / 2;
		if (a[mid] == key) {
			index = mid; break;
		}
		else if (a[mid] <= key) {
			low = mid + 1;		//因为mid已经比较过所以+1
		}
		else if (a[mid] > key) {
			high = mid - 1;		//同上
		}
		else {
			index = -1; break;
		}
	}
	if (index == -1) {
		printf("NULL");
	}
	else
		printf("%d", index);

	return 0;
}

参考

懒猫老师-C语言-二分查找(折半查找)_哔哩哔哩_bilibili

C语言二分查找法 - 尼古拉斯宝莉 - 博客园 (cnblogs.com)

第5关:计算数组中元素的最大值及其所在的行列下标值

​ 题目描述:按如下函数原型编程从键盘输入一个mn列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中mn的值由用户键盘输入。已知mn的值都不超过10

#include<stdio.h>
int main(void)
{
    /*********Begin*********/
    int a[10][10], m, n, max, i, j, maxi = 0, maxj = 0;
    printf("Input m, n:");
    scanf("%d,%d", &m, &n);
    printf("Input %d*%d array:\n", m, n);
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            scanf("%d", &a[i][j]);
    max = a[0][0];
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
            if (a[i][j] > max)
            {
                max = a[i][j];
                maxi = i;
                maxj = j;

            }
    }
    printf("max=%d, row=%d, col=%d", max, maxi + 1, maxj + 1);
    /*********End**********/
    return 0;
}

第6关:鞍点

​ 题目描述:找出具有mn列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10

#include<stdio.h>
int main(void)
{
    /*********Begin*********/
    int a[10][10], m, n, i, j, k, max, min, flag = 1;
    scanf("%d%d", &m, &n);
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)

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

    }
    for (i = 0; i < m; i++)
    {
        max = a[i][0];		//比较行
        k = 0;
        for (j = 1; j < n; j++)

            if (a[i][j] > max)
            {
                max = a[i][j];
                k = j;
            }

        min = a[0][k];		//比较列
        for (j = 1; j < m; j++)

            if (a[j][k] < min)
                min = a[j][k];
        if (max == min)
        {
            printf("Array[%d][%d]=%d", i, k, max);
            flag += 1;
        }


    }
    if (flag == 0)printf("None");
    /*********End**********/
    return 0;
}

第7关:删除最大值

​ 题目描述:输入10个互不相同的整数并保存在数组中,找到该最大元素并删除它,输出删除后的数组

#include<stdio.h>
#define m 10	//定义m=10
int main(void)
{
    int a[m], n, b, max;
    for (n = 0; n < 10; n++)
    {
        scanf("%d", &a[n]);
    }
    max = a[0];
    for (n = 0; n < 10; n++)
    {
        if (max < a[n])
        {
            max = a[n];
        }
    }
    for (n = 0; n < 10; n++)
    {
        if (a[n] == max)
        {
            if (n == 9)
            {
                break;
            }
            for (b = n; b < 9; b++)
            {
                a[b] = a[b + 1];	//将最大值移到最后
            }
            break;
        }
    }
    for (b = 0; b < 9; b++) {
        printf("%d ", a[b]);	//最后一个值不输出
    }
    return 0;
}

第8关:打印杨辉三角

​ 杨辉三角是一个无限对称的数字金字塔,从顶部的单个1开始,下面一行中的每个数字都是上面两个数字的和

#include<stdio.h>
int main(void)
{
    /*********Begin*********/
    int a[10][10], i, j;
    for (i = 0; i < 10; i++)

        a[i][0] = a[i][i] = 1;

    for (i = 2; i < 10; i++)

        for (j = 1; j < i; j++)

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


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

            printf("%4d", a[i][j]);		//%4d意思是空格加数字
        printf("\n");

    }

    /*********End**********/
    return 0;
}

!第9关:百灯判熄

​ 本关任务:有100盏灯,编号为1~100,分别有100个开关进行控制,开始时灯全是打开的,然后进行如下的操作:首先将编号凡是1的倍数的开关进行反向操作,然后再将是2的倍数的开关进行反向操作,依次类推直到最后对100的倍数的开关进行反向操作。求最后熄灭状态的灯的编号及总数

//当时抄的还没搞懂
#include "stdio.h"
void main()
{
    /************Begin************/
    int a[101], i, lamp, count = 0;
    for (lamp = 0; lamp <= 100; lamp++)
    {
        a[lamp] = 0;
    }
    for (i = 1; i <= 100; i++)
    {
        for (lamp = i; lamp <= 100; lamp += i)
        {
            a[lamp]++;
        }
    }
    printf("熄灭状态的灯的编号是:\n");
    for (i = 1; i <= 100; i++)
    {
        if (a[i] % 2 == 1)
        {
            printf("%4d", i);
            count++;
        }
    }
    printf("\n共有%d盏灯是灭的", count);
    /************End************/
}

第10关:青年歌手大奖赛_评委会打分

​ 本关任务:青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分

#include<stdio.h>
int main() {
    double n, a[100], max, min, sum;
    int i;
    while (~scanf("%lf", &n))	//意思是从键盘一直输入
    {
        if (n == 0)break;
        sum = 0;
        for (i = 0; i < n; i++)
            scanf("%lf", &a[i]);
        max = a[0]; min = a[0];
        for (i = 0; i < n; i++)
        {
            if (max < a[i])
                max = a[i];
            if (min > a[i])
                min = a[i];
        }
        for (i = 0; i < n; i++)
            if (a[i] != max && a[i] != min)
                sum += a[i];
        printf("%.2lf\n", sum / (n - 2));
    }
    return 0;
}
上一篇:Educoder-Java程序开发基础-异常处理之一


下一篇:Educoder 第1关:练习-Java字符串之正则表达式之匹配手机号码