- C++
备战CSP-J初赛21天打卡计划。第一天-练习题答案。
- @ 2024-8-31 10:29:19
DAY1-二进制
快问快答 题目数量 X 2
1、D 2、B
历年真题
1-5:AABDD
6-10:BBACA
11:B
进制转换
1、程序阅读题
1-6:BBADBD
选择题:
2-7:CCADDD
位运算
1、程序阅读题
16-21:ABBBBB
2单选题:
2-3:BD
1 条评论
-
mrhowe SU @ 2024-8-31 14:38:56进制转换 程序阅读题解析:
#include <iostream> using namespace std; long long n, ans; int k, len; long long d[1000000]; int main() { cin >> n >> k; // 读取输入的n和k d[0] = 0; // 初始化第一个位置的数字为0 len = 1; // 初始化长度为1 ans = 0; // 初始化进位次数为0 for (long long i = 0; i < n; ++i) { ++d[0]; // 每次循环将第一个位置的数字加1 for (int j = 0; j + 1 < len; ++j) { if (d[j] == k) { // 如果某个位置的数字达到k d[j] = 0; // 将该位置的数字重置为0 d[j + 1] += 1; // 下一个位置的数字加1 ++ans; // 进位次数加1 } } if (d[len - 1] == k) { // 如果最高位的数字达到k d[len - 1] = 0; // 将最高位的数字重置为0 d[len] = 1; // 新增一个位置,数字为1 ++len; // 长度加1 ++ans; // 进位次数加1 } } cout << ans << endl; // 输出总的进位次数 return 0; }这段代码的主要功能是计算在处理一系列数字时,需要进行多少次进位操作。具体来说,代码模拟了一个进位系统,其中每个位置上的数字最大为
k-1,当某个位置上的数字达到k时,就会发生进位。详细步骤
- 输入读取:
cin >> n >> k;:读取输入的n和k。n表示要处理的数字个数,k表示每个位置上的数字最大值。
- 初始化:
d[0] = 0;:初始化第一个位置的数字为0。len = 1;:初始化长度为1。ans = 0;:初始化进位次数为0。
- 处理数字:
- 使用一个
for循环处理n个数字。 ++d[0];:每次循环将第一个位置的数字加1。- 使用一个嵌套的
for循环检查每个位置的数字是否达到k。if (d[j] == k):如果某个位置的数字达到k,则进行进位操作。d[j] = 0;:将该位置的数字重置为0。d[j + 1] += 1;:下一个位置的数字加1。++ans;:进位次数加1。
if (d[len - 1] == k):如果最高位的数字达到k,则进行进位操作。d[len - 1] = 0;:将最高位的数字重置为0。d[len] = 1;:新增一个位置,数字为1。++len;:长度加1。++ans;:进位次数加1。
- 使用一个
- 输出结果:
cout << ans << endl;:输出总的进位次数。
示例输入输出
输入:
复制
5 3输出:
复制
2总结
这段代码通过模拟进位系统,计算在处理
n个数字时需要进行多少次进位操作。时间复杂度为O(n * len),其中len是进位系统的长度。 - 输入读取:
- 1