C++题目及解析

1. 数字反转

题目描述
输入一个整数(绝对值不超过10000),将其反转后输出。要求忽略前导零(如反转后为100,则输出1)。
输入格式
一行,一个整数n
输出格式
一行,反转后的整数
样例输入
-380
样例输出
-83
解析
通过字符串处理或数学取模反转,注意负号处理。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
    string s;
    cin >> s;
    int sign = 1, start = 0;
    if (s[0] == '-') {
        sign = -1;
        start = 1;
    }
    reverse(s.begin() + start, s.end());
    int num = stoi(s); // 自动去除前导零
    cout << num;
    return 0;
}

2. 最大公约数与最小公倍数

题目描述
输入两个正整数(均≤10000),输出它们的最大公约数和最小公倍数。
输入格式
一行,两个整数a b
输出格式
一行,两个整数(gcd lcm)
样例输入
12 18
样例输出
6 36
解析
欧几里得算法求gcd,lcm = a * b / gcd。

#include <iostream>
using namespace std;

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

int main() {
    int a, b;
    cin >> a >> b;
    int g = gcd(a, b);
    cout << g << " " << a * b / g;
    return 0;
}

3. 素数判定

题目描述
输入一个正整数n(n≤10000),判断是否为素数,输出"Yes"或"No"。
输入格式
一行,一个整数n
输出格式
一行,判断结果
样例输入
17
样例输出
Yes
解析
试除法判断,只需检查到√n即可。

#include <iostream>
#include <cmath>
using namespace std;

bool isPrime(int n) {
    if (n <= 1) return false;
    for (int i = 2; i <= sqrt(n); i++) 
        if (n % i == 0) return false;
    return true;
}

int main() {
    int n;
    cin >> n;
    cout << (isPrime(n) ? "Yes" : "No");
    return 0;
}

4. 斐波那契数列

题目描述
输入整数n(1≤n≤30),输出斐波那契数列第n项(F(1)=1, F(2)=1)。
输入格式
一行,一个整数n
输出格式
一行,一个整数
样例输入
5
样例输出
5
解析
递推或递归实现,注意递归可能超时,推荐递推。

#include <iostream>
using namespace std;

int main() {
    int n, f[31] = {0, 1, 1};
    cin >> n;
    for (int i = 3; i <= n; i++) 
        f[i] = f[i - 1] + f[i - 2];
    cout << f[n];
    return 0;
}

5. 字符统计

题目描述
输入一行字符串(长度≤1000),统计其中字母、数字、空格和其他字符的个数。
输入格式
一行字符串(可能包含空格)
输出格式
四行:字母数、数字数、空格数、其他字符数
样例输入
"Hello 123! *"
样例输出

5
3
2
2

解析
遍历字符串,用isalpha(), isdigit(), isspace()分类统计。

#include <iostream>
#include <cctype>
using namespace std;

int main() {
    string s;
    getline(cin, s);
    int alpha = 0, digit = 0, space = 0, other = 0;
    for (char c : s) {
        if (isalpha(c)) alpha++;
        else if (isdigit(c)) digit++;
        else if (isspace(c)) space++;
        else other++;
    }
    cout << alpha << endl << digit << endl << space << endl << other;
    return 0;
}

6. 矩阵对角线求和

题目描述
输入一个3×3矩阵,计算主对角线和副对角线元素之和。
输入格式
三行,每行三个整数
输出格式
两行:第一行主对角线和,第二行副对角线和
样例输入

1 2 3
4 5 6
7 8 9

样例输出

15
15

解析
主对角线:a[i][i],副对角线:a[i][2-i]。

#include <iostream>
using namespace std;

int main() {
    int a[3][3], s1 = 0, s2 = 0;
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++) {
            cin >> a[i][j];
            if (i == j) s1 += a[i][j];
            if (i + j == 2) s2 += a[i][j];
        }
    cout << s1 << endl << s2;
    return 0;
}

7. 冒泡排序

题目描述
输入n个整数(n≤100),用冒泡排序升序排列后输出。
输入格式
第一行整数n,第二行n个整数
输出格式
一行,排序后的整数(空格分隔)
样例输入

5
5 3 4 1 2

样例输出
1 2 3 4 5
解析
经典冒泡排序实现。

#include <iostream>
using namespace std;

int main() {
    int n, a[105];
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
    
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - 1 - i; j++)
            if (a[j] > a[j + 1]) 
                swap(a[j], a[j + 1]);
    
    for (int i = 0; i < n; i++) 
        cout << a[i] << " ";
    return 0;
}

8. 简单计算器

题目描述
输入两个整数和一个运算符(+、-、*、/),输出运算结果(除法保留两位小数)。
输入格式
一行:a op b(如:3 + 5)
输出格式
一行:结果
样例输入
6 / 4
样例输出
1.50
解析
根据运算符分支处理,注意除法类型转换。

#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    int a, b;
    char op;
    cin >> a >> op >> b;
    switch (op) {
        case '+': cout << a + b; break;
        case '-': cout << a - b; break;
        case '*': cout << a * b; break;
        case '/': 
            if (b == 0) cout << "Error";
            else printf("%.2f", static_cast<double>(a) / b);
            break;
    }
    return 0;
}

9. 数字出现次数

题目描述
输入n个整数(n≤1000),再输入一个目标数x,统计x出现的次数。
输入格式
第一行:n
第二行:n个整数
第三行:x
输出格式
一行:出现次数
样例输入

6
1 3 5 3 2 3
3

样例输出
3
解析
遍历数组计数即可。

#include <iostream>
using namespace std;

int main() {
    int n, x, cnt = 0, a[1005];
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
    cin >> x;
    for (int i = 0; i < n; i++) 
        if (a[i] == x) cnt++;
    cout << cnt;
    return 0;
}

10. 金币问题

题目描述
骑士第一天获得1金币,之后两天(第二、三天)每天获得2金币,接下来三天每天3金币...持续k天获得k金币。输入天数n(n≤10000),输出总金币数。
输入格式
一行,整数n
输出格式
一行,总金币数
样例输入
6
样例输出
14
解析
循环模拟发放过程。

#include <iostream>
using namespace std;

int main() {
    int n, total = 0, k = 1, days = 0;
    cin >> n;
    while (n) {
        int give = min(k, n);  // 当前阶段发放天数
        total += give * k;     // 发放金币
        n -= give;
        k++;                   // 进入下一阶段
    }
    cout << total;
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tezr123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值