十五届蓝桥杯省赛C/C++B组:试题 C: 好数,试题 D: R 格式

文章讲述了编程问题,涉及计算1到N中好数的数量(奇数位为奇数,偶数位为偶数),以及如何将浮点数按照R格式(乘以2^n并四舍五入)转换为整数。展示了C++代码实现这两个任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

试题 C: 好数

时间限制 : 1.0s  内存限制: 256.0MB 本题总分:10

 【问题描述】

一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位 · · · )上 的数字是奇数,偶数位(十位、千位、十万位 · · · )上的数字是偶数,我们就称 之为“好数”。 给定一个正整数 N ,请计算从 1 N 一共有多少个好数。 【输入格式】
一个整数 N
【输出格式】
一个整数代表答案。
【样例输入 1
24
【样例输出 1
7
【样例输入 2
2024
【样例输出 2
150
【样例说明】
对于第一个样例, 24 以内的好数有 1 3 5 7 9 21 23 ,一共 7 个。
【评测用例规模与约定】
对于 10 % 的评测用例, 1 N 100
对于 100 % 的评测用例, 1 N 10^ 7

运行代码

#include <iostream>
using namespace std;
bool Good(int num) {
    int pos = 1;
    while (num > 0) {
        int digit = num % 10;
        if ((pos % 2 == 1 && digit % 2 == 0) || (pos % 2 == 0 && digit % 2 == 1)) {
            return false;
        }
        num /= 10;
        pos++;
    }
    return true;
}

int Count(int n) {
    int count = 0;
    for (int i = 1; i <= n; i++) {
        if (Good(i)) {
            count++;
        }
    }
    return count;
}

int main() {
    int n;
    cin >> n;
    cout << Count(n) << endl;
    return 0;
}

代码思路

计算从 1 到给定整数 n范围内的 “好数” 的个数。“好数” 的定义是如果一个整数从低位到高位,奇数位上的数字是奇数,偶数位上的数字是偶数,那么这个数就是 “好数”。

  1. Good函数:判断一个整数是否为 “好数”。num代表要判断的整数。

    • 使用 pos变量记录当前数字的位数位置,初始为 1,表示个位。
    • 进入循环,当 num大于 0 时,每次取 num的最后一位数字 digit(通过 num % 10)。
    • 根据 pos的奇偶性判断 digit是否符合 “好数” 的条件。如果 pos是奇数位且 digit是偶数,或者 pos是偶数位且 digit是奇数,则满足条件;否则不满足条件,直接返回 false
    • 每判断一位数字后,将 num除以 10(num /= 10),同时 pos加一,继续判断下一位数字。如果所有位数都满足条件,则返回 true
  2. Count函数:计算从 1 到给定整数 n范围内 “好数” 的个数。n代表范围的上限。

    • 使用 count变量记录 “好数” 的个数,初始为 0。
    • 通过循环遍历从 1 到 n的所有整数。
    • 对于每个整数 i,调用 Good函数判断是否为 “好数”,如果是,则将 count加一。
    • 循环结束后,返回 count作为 “好数” 的个数。
  3. main函数:输入一个整数 n,调用 Count函数计算并输出从 1 到 n范围内 “好数” 的个数。读取用户输入的整数 n。调用 Count函数计算 “好数” 的个数输出计算结果。

试题 D: R 格式

时间限制 : 1.0s  内存限制: 256.0MB  本题总分:10

【问题描述】

小蓝最近在研究一种浮点数的表示方法: R 格式。对于一个大于 0 的浮点
d ,可以用 R 格式的整数来表示。给定一个转换参数 n ,将浮点数转换为 R
格式整数的做法是: 1. 将浮点数乘以 2 n ; 2. 四舍五入到最接近的整数。
【输入格式】
一行输入一个整数 n 和一个浮点数 d ,分别表示转换参数,和待转换的浮点数。
【输出格式】
输出一行表示答案:d 用 R 格式表示出来的值。
【样例输入】
2 3.14
【样例输出】
13
【样例说明】
3 . 14 × 2 2 = 12 . 56 ,四舍五入后为 13
【评测用例规模与约定】
对于 50 % 的评测用例: 1 n 10 1 d 视为字符串时的长度 15
对于 100 % 的评测用例: 1 n 1000 1 d 视为字符串时的长度 ≤ 1024 ;保证 d 是小数,即包含小数点。

运行代码

#include <iostream>
#include <cmath>
using namespace std;
int convert(int n, double d) {
    return round(d * pow(2, n));
}
int main() {
    int n;
    double d;
    cin >> n >> d;
    cout << convert(n, d) << endl;
    return 0;
}

上述这个代码只可以通过部分数据

使用高精度乘法

#include <iostream>
#include <vector>
#include <string>

using namespace std;

// 乘法函数
vector<int> multiply(vector<int>& A, int b) {
    vector<int> result;
    int carry = 0;
    for (int i = 0; i < A.size() || carry; ++i) {
        int sum = carry;
        if (i < A.size()) sum += A[i] * b;
        result.push_back(sum % 10);
        carry = sum / 10;
    }
    while (result.size() > 1 && result.back() == 0) result.pop_back();
    return result;
}

int main() {
    int n;
    string str;
    cin >> n >> str;
    int dot= str.find('.');
    int d = str.size() - dot - 1;
    vector<int> num;
    for (int i = str.size() - 1; i >= 0; --i) {
        if (str[i]!= '.') num.push_back(str[i] - '0');
    }
    vector<int> res = num;
    for (int i = 1; i <= n; ++i) res = multiply(res, 2);
    if (res[d - 1] > 4) res[d]++;
    for (int i = res.size() - 1; i >= d; --i) cout << res[i];
    return 0;
}

代码思路

读取一个包含小数点的数字字符串,将其转换为整数数组表示,然后对这个数字进行 n 次乘以 2 的操作,并根据小数点后的特定位置数字进行四舍五入,最后输出四舍五入后的结果。

  1. multiply 函数:实现两个数的模拟乘法运算,其中一个数用整数向量 A 表示,另一个数是整数 b

    • 最后返回乘法运算的结果向量。
    • 循环结束后,如果 result 向量末尾有多余的 0,则去除这些多余的 0(保证结果的简洁性)。
    • 更新进位值 carry 为 sum 除以 10。
    • 将 sum 对 10 取余得到当前位的结果数字,存入 result 向量中。
    • 对于每一位,计算当前位的和 sum,等于进位值 carry,如果当前索引小于 A 的大小,则加上当前位数字与 b 的乘积。
    • 遍历 A 的每一位或者当有进位时继续循环。
    • 创建一个结果向量 result 和一个进位变量 carry 初始化为 0。
  2. main 函数

    • 输入部分:读取一个整数 n 和一个字符串 str,代表要进行的乘法次数和初始数字字符串。通过 str.find('.') 找到字符串中小数点的位置,存入变量 dot,并计算出小数点后的位数 d
    • 转换部分:创建一个整数向量 num,通过从字符串末尾开始遍历,将非小数点的字符转换为数字并存入 num 中。初始化结果向量 res 为 num
    • 乘法和四舍五入部分:通过循环 n 次调用 multiply 函数对 res 进行乘以 2 的操作。根据小数点后特定位置的数字判断是否需要四舍五入,如果 res[d - 1](小数点后一位)大于 4,则将 res[d](小数点后要输出的第一位)加 1。
    • 输出部分:从结果向量 res 的末尾开始,输出从 d 位置开始到末尾的数字,即四舍五入后的结果。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

筱姌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值