ACM社团第一次测试题解(禁止直接复制粘贴提交)
第一题:中位数
思路:
解法一:暴力比较,两个数之间一直比较得出中位数
解法二:快排函数,数组中间值即为中位数
代码:
1.c语言版:
#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++版:
#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语言版:
#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++版:
#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语言:
#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++:
#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位小数)即可
代码:
#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:
#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++:
//}
#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):
#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:
#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:
#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++:
#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:
#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++:
#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;
}
原文地址:https://blog.csdn.net/xxx_jsu/article/details/143522969
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!