第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;
}