当前位置: 首页 > article >正文

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;
}


http://www.kler.cn/a/547685.html

相关文章:

  • LM Studio笔记
  • 【人工智能】如何选择合适的大语言模型,是能否提高工作效率的关键!!!
  • 云计算——AWS Solutions Architect – Associate(saa)7.放置群组
  • print(f“Random number below 100: {random_number}“)的其他写法
  • 了解rtc_time64_to_tm()和rtc_tm_to_time64()
  • Biopython PDB模块的PDBParser和MMCIFParser介绍
  • 如何使用CSS画一个三角形,原理是什么?
  • DeepSeek操作Excel,实现图表自动化生成
  • LLaMA-Factory DeepSeek-R1 模型 微调基础教程
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十二节】
  • PLC跨平台通信困难?DeepSeek边缘计算网关实现数据无缝连接!
  • 【PSIM】RS触发器的使用
  • 08模拟法 + 技巧 + 数学 + 缓存(D2_技巧)
  • 【自学笔记】深度学习基础知识点总览-持续更新
  • 《Spring实战》(第6版)第2章 开发Web应用
  • 基于STM32的智能鱼塘养殖监控系统
  • 【动态路由】系统Web URL资源整合系列(后端技术实现)【nodejs实现】
  • 免费deepseek的API获取教程及将API接入word或WPS中
  • 安装 Docker Desktop 修改默认安装目录到指定目录
  • DeepSeek 助力 Vue 开发:打造丝滑的卡片(Card)