1 条题解
-
0
简单解题思路
问题描述:
给定一个大数(用字符串表示)和一个整数
b
,通过以下步骤生成一个结果数组:- 计算大数对
b
取模的值(如果模为 0,则取b
)。 - 从大数中减去这个模值。
- 将大数除以
b
。 - 重复上述步骤,直到大数变为 0。
- 最后将存储的模值逆序输出。
核心步骤:
- 取模:计算当前大数对
b
的余数(若余数为 0,则改为b
)。 - 减法:从大数中减去这个余数。
- 除法:将大数除以
b
。 - 存储结果:将余数存入数组,重复直到大数为 0。
- 输出:逆序输出数组中的余数。
示例:
- 输入:
b = 3
,data = "10"
(即十进制 10)- 10 % 3 = 1 → 存 1,10 - 1 = 9,9 / 3 = 3
- 3 % 3 = 0 → 存 3,3 - 3 = 0,0 / 3 = 0
- 结束,数组为
[1, 3]
,逆序输出"31"
。
关键点:
- 用字符串处理大数,避免溢出。
- 每次迭代确保余数在
[1, b]
范围内(模 0 时取b
)。 - 逆序输出结果。
#include <cstdio> #include <cstring> #define N 105 int b; int ans[4 * N]; int cnt; char data[N]; char tmp[N]; // 计算 data 表示的数对 b 取模的结果 int mod() { int ret = 0; int len = strlen(data); for (int i = 0; i < len; ++i) { ret = (ret * 10 + data[i] - '0') % b; } return ret % b; } // 判断 data 是否为 1 后面跟若干个 0 的形式 bool judge() { int len = strlen(data); if (data[0] != '1') { return false; } for (int i = 1; i < len - 1; ++i) { if (data[i] != '0') { return false; } } return true; } // 从 data 表示的数中减去 x void sub(int x) { int len = strlen(data); if (data[len - 1] - '0' >= x) { data[len - 1] -= x; } else if (judge()) { for (int i = 0; i < len - 2; ++i) { data[i] = '9'; } data[len - 2] = data[len - 1] + 10 - x; data[len - 1] = '\0'; } else { int y = len - 2; data[len - 1] += 10 - x; while (data[y] == '0') { data[y] = '9'; y--; } data[y]--; } } // 将 data 表示的数除以 b void div() { int x = 0; int len = strlen(data); int ret = 0; int i = 0; if (data[0] - '0' < b) { ret += data[0] - '0'; i++; } for (; i < len; ++i, ++x) { ret = ret * 10 + data[i] - '0'; tmp[x] = ret / b + '0'; ret %= b; } tmp[x] = '\0'; memcpy(data, tmp, sizeof(data)); } int main() { int i; scanf("%d", &b); scanf("%s", data); if (data[0] == '0') { printf("\n"); } else { cnt = 0; while (true) { ans[cnt] = mod(); if (ans[cnt] == 0) { ans[cnt] = b; } sub(ans[cnt]); div(); cnt++; if (data[0] == '0' || strlen(data) == 0) { break; } } for (i = cnt - 1; i >= 0; --i) { printf("%d", ans[i]); } printf("\n"); } return 0; }
- 计算大数对
- 1
信息
- ID
- 895
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者