【CodeSprint】第二章-2.1 简单模拟

第二章 2.1 简单模拟

✏️ 关于专栏:专栏用于记录 prepare for the coding test


1. 简单模拟

简单模拟题目不需要复杂算法,直接按照题意一步步模拟即可。

1.1 促销计算

题目描述

某百货公司为了促销,采用购物打折的优惠方法:

  • 购物金额 > 5000 元,按 8 折优惠;
  • 3000 < 金额 ≤ 5000 元,按 8.5 折优惠;
  • 2000 < 金额 ≤ 3000 元,按 9 折优惠;
  • 1000 < 金额 ≤ 2000 元,按 9.5 折优惠;
  • 金额 ≤ 1000 元,不打折。

编写程序,输入多组购物金额,计算并输出对应的折扣和支付金额。

输入输出格式
  • 输入:多行,每行一个整数,表示某次购物的金额。
  • 输出 :对应各行,格式为 discount=折扣,pay=支付金额
样例
text 复制代码
输入:            
850               
1230              
5000              
3560              

输出:
discount=1,pay=850
discount=0.95,pay=1168.5
discount=0.8,pay=4000
discount=0.85,pay=3026
C++ AC 代码
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    int pay;
    while (cin >> pay) {
        if (pay <= 1000)
            cout << "discount=1,pay="  << pay       << endl;
        else if (pay <= 2000)
            cout << "discount=0.95,pay=" << pay * 0.95 << endl;
        else if (pay <= 3000)
            cout << "discount=0.9,pay="  << pay * 0.9  << endl;
        else if (pay <= 5000)
            cout << "discount=0.85,pay=" << pay * 0.85 << endl;
        else
            cout << "discount=0.8,pay="  << pay * 0.8  << endl;
    }
    return 0;
}

小结:本题关键在于分段判断并计算折扣,属于典型的区间模拟题。


1.2 求 1 到 n 的和

题目描述

输入一个整数 n,输出 1 + 2 + ... + n 的和。

输入输出格式
  • 输入 :一个整数 nn ≤ 100)。
  • 输出 :从 1 累加到 n 的结果。
样例
text 复制代码
输入:5
输出:15
C++ AC 代码
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    int sum = 0;
    for (int i = 1; i <= n; i++) {
        sum += i;
    }
    cout << sum << endl;
    return 0;
}

小结:简单累加循环,时间复杂度 O(n)。


1.3 计算 Sn

题目描述

计算数列 Sn=a+aa+aaa+⋯+aaa...a⏟n 个 aS_n = a + aa + aaa + \dots + \underbrace{aaa\dots a}_{n\text{ 个 }a} 的和,其中 a 为 1 位数。

例如:当 a=2, n=5 时,需计算 2 + 22 + 222 + 2222 + 22222

输入输出格式
  • 输入 :两个整数 a, n1 < a, n < 10)。
  • 输出:上述数列的总和。
样例
text 复制代码
输入:2 5
输出:24690
C++ AC 代码
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    int a, n;
    cin >> a >> n;
    int sum = 0;
    int term = a;
    for (int i = 1; i <= n; i++) {
        sum += term;
        term = term * 10 + a;  // 在末尾添加一位 'a'
    }
    cout << sum << endl;
    return 0;
}

小结 :利用 term = term * 10 + a 迭代生成每一项,避免字符串操作。


1.4 利润提成计算

题目描述

根据企业利润分段计算奖金:

利润区间 (元) 提成比例
≤ 100 000 10%
100 000 < I ≤ 200 000 7.5%
200 000 < I ≤ 400 000 5%
400 000 < I ≤ 600 000 3%
600 000 < I ≤ 1 000 000 1.5%
> 1 000 000 1%

编写程序,输入当月利润 I,输出应发奖金总额。

输入输出格式
  • 输入 :一个整数 I
  • 输出:对应的奖金金额(浮点数)。
样例
text 复制代码
输入:900
输出:90
C++ AC 代码
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

double calcBonus(int profit) {
    static const vector<pair<int,double>> tiers = {
        {100000, 0.10}, {200000, 0.075}, {400000, 0.05},
        {600000, 0.03},  {1000000, 0.015}, {INT_MAX, 0.01}
    };
    double bonus = 0;
    int prev = 0;
    for (auto &[limit, rate] : tiers) {
        if (profit > prev) {
            int diff = min(profit, limit) - prev;
            bonus += diff * rate;
            prev = limit;
        } else break;
    }
    return bonus;
}

int main() {
    int I;
    cin >> I;
    cout << fixed << setprecision(2) << calcBonus(I) << endl;
    return 0;
}

小结:采用分段累加方法,代码更易扩展和维护。


1.5 身份证校验

题目描述

校验中国二代身份证号:共 18 位,最后一位为校验位。校验方法:

  1. 前 17 位各数字分别乘以相应权值:

    w = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]

  2. 将所得乘积求和 S,取 S % 11 = x

  3. x 与校验字符映射:

    x 0 1 2 3 4 5 6 7 8 9 10
    校验位 1 0 X 9 8 7 6 5 4 3 2

若第 18 位字符与映射结果一致,则身份证合法。

输入输出格式
  • 输入 :多行,每行一个 18 位身份证号(末位可能为大写 X)。
  • 输出 :对应每行,合法输出 ID Corrent,否则输出 ID Wrong
样例
text 复制代码
输入:
1222222222
111111111111111111
341181198809150011
11010119900307387X
150102199003075131
150102200003075131

输出:
ID Wrong
ID Wrong
ID Corrent
ID Corrent
ID Corrent
ID Wrong
C++ AC 代码(优化版)
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    static const int weights[17] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    static const char mapping[11] = {'1','0','X','9','8','7','6','5','4','3','2'};
    string id;
    while (cin >> id) {
        if (id.size() != 18) {
            cout << "ID Wrong" << endl;
            continue;
        }
        int sum = 0;
        for (int i = 0; i < 17; ++i)
            sum += (id[i] - '0') * weights[i];
        int mod = sum % 11;
        cout << (mapping[mod] == id[17] ? "ID Corrent" : "ID Wrong") << endl;
    }
    return 0;
}

小结:使用数组与常量映射,代码简洁易读。

相关推荐
渭雨轻尘_学习计算机ing16 分钟前
二叉树构建算法全解析
算法·程序员
C语言魔术师1 小时前
70. 爬楼梯
算法·动态规划
跳跳糖炒酸奶2 小时前
第二章、Isaaclab强化学习包装器(1)
人工智能·python·算法·ubuntu·机器人
许_安2 小时前
leetcode刷题日记——两数相加
算法·leetcode·职场和发展
夜晚中的人海2 小时前
【C语言】初阶算法相关习题(二)
c语言·开发语言·算法
PXM的算法星球3 小时前
【算法笔记】贪心算法
笔记·算法·贪心算法
傻欣3 小时前
代码随想录学习笔记---二叉树
笔记·学习·算法
WW_千谷山4_sch3 小时前
MYOJ_1349:(洛谷P3951)[NOIP 2017 提高组] 小凯的疑惑(数学公式套用,两步搞定代码)
c++·算法
我想进大厂3 小时前
图论---拓扑排序(DFS)
算法·深度优先·图论
泽02023 小时前
数据结构之排序
数据结构·算法·排序算法