PAT乙组(1016 部分A+B 1017 A除以B)C语言超详细
文章目录
- 1016 部分A+B
- 1017 A除以B
1016 部分A+B
输入样例 1:
3862767 6 13530293 3
输出样例 1:
399
输入样例 2:
3862767 1 13530293 8
输出样例 2:
0
代码长度限制 16 KB
时间限制 150 ms
内存限制 64 MB
栈限制 8192 KB
思路解析
输入解析:
首先,程序读取四个整数 a, da, b, db。其中 a 和 b 为原始数字,da 和 db为我们需要提取的数字。这些输入将直接用于后续的数字提取与计算。
初始化变量:
count1 和 count2:用于记录当前位的权重(即十进制位数),初始值为 1。 sum1 和 sum2:分别用来存储从数字 a 和 b中提取出来的符合条件的数字部分。
提取 A 中符合要求的数字部分:
使用 while (a != 0) 循环逐位处理数字 a。 在每一轮中,通过 a % 10 提取出数字的当前最低位,判断该位是否等于 da。如果相等,将该位的数字按当前位权(即 count1)加入到 sum1 中,然后将 count1 乘以 10(使得下一位的权重加倍)。然后通过 a /= 10 去掉当前最低位,继续处理剩余的数字。
B同理
计算结果:
最终,程序输出 sum1 + sum2,即 P_A 和 P_B 的和
代码示例
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
int main() {
// 输入:a, da, b, db 四个整数
int a, da, b, db;
scanf("%d %d %d %d", &a, &da, &b, &db);
// 初始化一些变量
int count1 = 1, count2 = 1; // 用来记录当前位的权重(十进制位数)
int sum1 = 0, sum2 = 0; // 用来分别保存P_A和P_B
// 处理 A 的部分
while (a != 0) {
int t = a % 10; // 取出 A 的当前最低位数字
if (t == da) {
sum1 += count1 * da; // 将 D_A 添加到 sum1 中,乘以相应的位权
count1 *= 10; // 位权乘以10,准备处理下一位
}
a /= 10; // 去掉当前最低位
}
// 处理 B 的部分
while (b != 0) {
int t = b % 10; // 取出 B 的当前最低位数字
if (t == db) {
sum2 += count2 * db; // 将 D_B 添加到 sum2 中,乘以相应的位权
count2 *= 10; // 位权乘以10,准备处理下一位
}
b /= 10; // 去掉当前最低位
}
// 输出结果,P_A + P_B
printf("%d", sum1 + sum2);
return 0;
}
1017 A除以B
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
代码长度限制 16 KB
时间限制 100 ms
内存限制 64 MB
栈限制 8192 KB
思路解析
初始化变量:
t:用来存储每一步的余数,初始化为 0。
q:用来存储商数,每计算出一位商数,将其添加到该数组中。
qindex:用来标记商数组的当前位置,初始为 0。
逐位计算商和余数:
循环遍历 A 中的每一位数字。
t = t * 10 + (a[i] - '0')
:这一步是将当前的余数 t 乘以10,然后加上当前位的数字。a[i] - ‘0’ 通过字符减去 ‘0’,将字符转为数字。
q[qindex++] = t / b +'0'
:这一步计算当前位的商数(即 t / b),并将其转化为字符加到 q 数组中。注意,‘0’ 是 ASCII 值 48,因此我们需要加上 ‘0’ 来将数字转换回字符形式。
t = t % b
:更新余数 t 为当前的余数,即 t % b。
去掉商数的前导零:
商数的计算过程中,可能会产生前导零,特别是当商的第一个非零数字位之后出现零时。为了去掉前导零,我们使用一个 start变量来标记商数的第一个有效数字的位置。
while (q[start] == '0' && start < qindex -1)
:这个循环用于跳过商数 q 中的前导零。start 会指向第一个非零的数字。
输出结果:
最后,我们输出商数和余数。printf(“%s %d\n”, &q[start], t) 输出从 q[start] 开始的商数和当前的余数 t。
代码示例
#include <stdio.h>
#include <string.h>
int main() {
char a[1001];
int b, t = 0;
char q[1001];
// 读取输入
scanf("%s %d", a, &b);
int len = strlen(a);
int qindex = 0;
// 逐位处理
for (int i = 0; i < len; i++) {
// 更新余数,a[i] - '0' 获取当前数字
t = t * 10 + (a[i] - '0');
// 将商数字符追加到 q 数组
q[qindex++] = t / b + '0';
// 更新余数
t = t % b;
}
// 终止符
q[qindex] = '\0';
// 去除商数中的前导零
int start = 0;
while (q[start] == '0' && start < qindex - 1) {
start++;
}
// 输出商数和余数
printf("%s %d\n", &q[start], t);
return 0;
}