ACM社团第一次测试题解(禁止直接复制粘贴提交)

第一题:中位数

思路:

解法一:暴力比较,两个数之间一直比较得出中位数

解法二:快排函数,数组中间值即为中位数

代码:

1.c语言版:

cpp 复制代码
#include <stdio.h>
int arr[10010];
void solve() {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    arr[1] = a;
    arr[2] = b;
    arr[3] = c;
    // 使用冒泡排序来排序 arr[1], arr[2], arr[3]
    for (int i = 1; i <= 2; i++) { // 需要排序两轮
        for (int j = 1; j <= 2; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换 arr[j] 和 arr[j + 1]
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    
    // 输出中间值
    printf("%d\n", arr[2]);
}

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        solve();
    }
    return 0;
}

2.c++版:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int arr[10010];
void solve() {
	int a, b, c;
	cin >> a >> b >> c;
	arr[1] = a;
	arr[2] = b;
	arr[3] = c;
	sort(arr + 1, arr + 1 + 3);
	cout << arr[2] << endl;
	return;
}
int main() {
	int t;
	cin >> t;
	while(t--)
	solve();
	return 0;
}

第二题:求和

思路:判断是否有两个数相加为第三个数即可

代码:

1.c语言版:

cpp 复制代码
#include <stdio.h>
void solve() {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    
    if (a + b == c || a + c == b || b + c == a) {
        printf("YES\n");
    } else {
        printf("NO\n");
    }
}
int main() {
    int t;
    scanf("%d", &t);
    
    while (t--) {
        solve();
    }
    
    return 0;
}

2.c++版:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
void solve() {
	int a, b, c;
	cin >> a >> b >> c;
	if (a + b == c || a + c == b || b + c == a) {
		cout << "YES\n";
	}
	else {
		cout << "NO\n";
	}
	return;
}
int main() {
	int t;
	cin >> t;
	while(t--)
	solve();
	return 0;
}

第三题:字符倒置简易版

思路:使用gets函数读入字符串(字符串中有可能含有空字符串),根据其长度倒序输出即可

代码:

1.c语言:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[10000];
int b,i;
gets(a);
b=strlen(a);
for(i=b-1;i>=0;i--)
printf("%c",a[i]);
return 0;
}

2.c++:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
void solve() {
	string s;
	getline(cin,s);
	int l = s.size();
	for (int i = s.size() - 1; i >= 0; i--) {
		cout << s[i];
	}
	return;
}
int main() {
	solve();
	return 0;
}

第四题:求a/b

思路:除法不多说,注意(保留10位小数)即可

代码:

cpp 复制代码
#include<stdio.h>
int main()
{
    int a,b;
    while(scanf("%d %d",&a,&b)!=EOF)
    {
       printf("%.10lf\n",(double)a/b);
    }
    return 0;
}

第五题:这怕又是一道水题了

思路:判断长度为n的数组中的每个元素是否都比m小,若小于m的个数=n,即yes,否则no

代码:

1.c:

cpp 复制代码
#include <stdio.h>
int a[100010];
void solve() {
    int n, m;
    scanf("%d %d", &n, &m);  // 使用 scanf 获取 n 和 m
    int num = 0;
    // 输入数组
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);  // 输入数组元素
    }
// 计算符合条件的个数
    for (int i = 1; i <= n; i++) {
        if (m > a[i]) {
            num++;  // 如果 m 大于 a[i],计数加 1
        }
    }
// 判断并输出结果
    if (num == n) {
        printf("yes\n");
    } else {
        printf("no\n");
    }
}
int main() {
    solve();
    return 0;
}

2.c++:

cpp 复制代码
//}
#include<bits/stdc++.h>
using namespace std;
int a[100010];
void solve() {
	int n, m;
	cin >> n >> m;
	int num = 0;
	for (int i = 1; i <= n; i++)cin >> a[i];
	for (int i = 1; i <= n; i++)if (m > a[i])num++;
	if (num == n)cout << "yes\n";
	else cout << "no\n";
	return;
}
int main() {
	solve();
	return 0;
}

第六题:插数排序

思路:根据题目要求先进行判断,若小于最后一个数再进行插入,我们需要遍历一遍数组,找到一个合适位置进行插入(其左边的数<=要插入的数<=其右边的数)

这道题可以去学一下set

代码(未使用set):

cpp 复制代码
#include <stdio.h>
int main() {
    int n, num, k;
    int arr[10010];  // 假设最多有 10000 个元素
    int idx = 0;  // 当前数组的元素数量

    // 输入 n 个整数
    scanf("%d", &n);
    while (n--) {
        scanf("%d", &num);
        // 插入前检查是否已经存在,避免重复
        int exists = 0;
        for (int i = 0; i < idx; i++) {
            if (arr[i] == num) {
                exists = 1;
                break;
            }
        }
        if (!exists) {
            arr[idx++] = num;  // 插入元素到数组
        }
    }

    // 输入 k 并插入
    scanf("%d", &k);
    int exists = 0;
    for (int i = 0; i < idx; i++) {
        if (arr[i] == k) {
            exists = 1;
            break;
        }
    }
    if (!exists) {
        arr[idx++] = k;  // 插入 k
    }
    // 使用插入排序对数组进行排序
    for (int i = 1; i < idx; i++) {
        int key = arr[i];
        int j = i - 1;
        // 将大于 key 的元素右移
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
   // 输出集合中的元素
    for (int i = 0; i < idx; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

使用set:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
void solve() {
	int n, m, k;
	cin >> n;
	set<int>s;
	while (n--) {
		cin >> m;
		s.insert(m);
	}
	cin >> k;
	s.insert(k);
	for (auto ss: s) {
		cout << ss << " ";
	}
	return;
}
int main() {
	solve();
	return 0;
}

第七题:星号图形

思路:发现规律,从第一行开始,*前面的空格数=n-当前行数,*数=2*当前行数-1

代码:

1.c:

cpp 复制代码
#include <stdio.h>

void solve() {
    int n;
    scanf("%d", &n);  // 读入整数n
    for (int i = 1; i <= n; i++) {
        // 打印前导空格
        for (int j = 1; j <= n - i; j++) {
            printf(" ");
        }
        // 打印星号
        for (int k = 1; k <= 2 * i - 1; k++) {
            printf("*");
        }
        // 打印换行
        printf("\n");
    }
}

int main() {
    solve();  // 调用solve函数
    return 0;
}

2.c++:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
void solve() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n - i; j++)cout << " ";
		for (int k = 1; k <= 2 * i - 1; k++)cout << "*";
		cout << endl;
	}
	return;
}
int main() {
	solve();
	return 0;
}

第八题:冠军

思路:

输入字符串,若相邻的五个字符分别为'edgnb',则将个数+1

代码:

1.c:

cpp 复制代码
#include <stdio.h>
#include <string.h>

void solve() {
    char s[100001];  // 假设最大字符串长度为 100000
    scanf("%s", s);  // 读取字符串
    int l = strlen(s);  // 获取字符串长度
    int k = 0;
    
    // 注意:循环到 l - 5,因为我们要检查每个位置是否有 'edgnb' 字符串
    for (int i = 0; i <= l - 5; i++) {
        if (s[i] == 'e' && s[i + 1] == 'd' && s[i + 2] == 'g' && s[i + 3] == 'n' && s[i + 4] == 'b') {
            k++;  // 如果匹配,计数加 1
        }
    }
    
    printf("%d\n", k);  // 输出结果
}

int main() {
    solve();  // 调用 solve 函数
    return 0;
}

2.c++:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
void solve() {
	string s;
	cin >> s;
	int l = s.size();
	int k = 0;
	for (int i = 0; i <= l; i++) {
		if (s[i] == 'e' && s[i + 1] == 'd' && s[i + 2] == 'g' && s[i + 3] == 'n' && s[i + 4] == 'b')k++;
	}
	cout << k << endl;
	return;
}
int main() {
	solve();
	return 0;
}
相关推荐
诚丞成2 分钟前
计算世界之安生:C++继承的文水和智慧(上)
开发语言·c++
清梦20206 分钟前
经典问题---跳跃游戏II(贪心算法)
算法·游戏·贪心算法
Dream_Snowar28 分钟前
速通Python 第四节——函数
开发语言·python·算法
Altair澳汰尔41 分钟前
数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者
人工智能·算法·机器学习·数据分析·知识图谱
东风吹柳1 小时前
观察者模式(sigslot in C++)
c++·观察者模式·信号槽·sigslot
嵌入式科普1 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
A懿轩A1 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
Python机器学习AI1 小时前
分类模型的预测概率解读:3D概率分布可视化的直观呈现
算法·机器学习·分类
吕小明么2 小时前
OpenAI o3 “震撼” 发布后回归技术本身的审视与进一步思考
人工智能·深度学习·算法·aigc·agi
大胆飞猪2 小时前
C++9--前置++和后置++重载,const,日期类的实现(对前几篇知识点的应用)
c++