第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关:计算数组中元素的最大值及其所在的行列下标值
题目描述:按如下函数原型编程从键盘输入一个m
行n
列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中m
和n
的值由用户键盘输入。已知m
和n
的值都不超过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关:鞍点
题目描述:找出具有m
行n
列二维数组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;
}