PTA编程题:N个数求和

问题描述

在这里插入图片描述


思路分析

问题分解

  • 输入处理:将分数拆解为分子和分母,存储并处理。

  • 分数相加规则
    在这里插入图片描述

    即分子相加、分母相乘。

  • 结果化简:求分数的最大公因数(GCD),将其约分至最简形式。

  • 带分数处理

    • 分数可以表示为:
      在这里插入图片描述

    • 如果分子整除分母,则结果为整数;否则需要输出带分数形式。

具体思路

  1. 读取输入

    • 输入第一行为分数个数 N ,第二行为 N 个分数,格式为 分子/分母
  2. 初始化和变量定义

    • 定义两个变量,分别表示结果分子分母,初始值为 0/1
  3. 分数求和

    • 对每个输入的分数,按加法规则更新:
      • 新的分子为: sum_numerator = sum_numerator × 当前分母 + 当前分子 × sum_denominator
      • 新的分母为: sum_denominator = sum_denominator × 当前分母
    • 在每次相加后,调用 约分函数,保持分数为最简形式。
  4. 结果格式化

    • 分解为整数部分和分数部分:
      • 整数部分: 整数 = 分子 ÷ 分母
      • 分数部分: 新分子 = 分子 % 分母
    • 输出规则:
      • 如果整数部分为 0 ,只输出分数部分
      • 如果分数部分为 0 ,只输出整数部分
      • 否则输出“整数部分 + 分数部分”。

参考代码(C)

#include <stdio.h>// 计算最大公因数(GCD)
long long gcd(long long a, long long b) {return b == 0 ? a : gcd(b, a % b);
}// 约分函数
void simplify(long long *numerator, long long *denominator) {long long g = gcd(*numerator, *denominator);*numerator /= g;*denominator /= g;
}// 主函数
int main() {int N;scanf("%d", &N);long long sum_numerator = 0, sum_denominator = 1;for (int i = 0; i < N; i++) {long long numerator, denominator;scanf("%lld/%lld", &numerator, &denominator);// 分数相加sum_numerator = sum_numerator * denominator + numerator * sum_denominator;sum_denominator *= denominator;// 约分中间结果simplify(&sum_numerator, &sum_denominator);}// 处理结果为整数和分数部分long long integer_part = sum_numerator / sum_denominator;long long fraction_numerator = sum_numerator % sum_denominator;if (fraction_numerator == 0) {printf("%lld\n", integer_part); // 只有整数部分} else {if (integer_part != 0) {printf("%lld %lld/%lld\n", integer_part, fraction_numerator, sum_denominator);} else {printf("%lld/%lld\n", fraction_numerator, sum_denominator);}}return 0;
}

代码分析

1. gcd函数

long long gcd(long long a, long long b) {return b == 0 ? a : gcd(b, a % b);
}
  • 功能:计算两个整数 ab 的最大公因数(GCD)。
  • 逻辑
    • 如果 b = 0 ,则 GCD 是 a
    • 否则递归调用:gcd(a, b) = gcd(b, a % b)
  • 作用:用于约分分数。

2. simplify函数

void simplify(long long *numerator, long long *denominator) {long long g = gcd(*numerator, *denominator);*numerator /= g;*denominator /= g;
}
  • 功能:将分数化为最简形式。
  • 逻辑
    1. 使用 gcd 计算分子和分母的最大公因数 g
    2. g 将分子和分母同时除以 g ,达到约分效果。
  • 作用:保持所有分数在每次加法后都为最简形式,避免数字膨胀。

3. 主函数结构

int main() {int N;scanf("%d", &N);long long sum_numerator = 0, sum_denominator = 1;for (int i = 0; i < N; i++) {long long numerator, denominator;scanf("%lld/%lld", &numerator, &denominator);// 分数相加sum_numerator = sum_numerator * denominator + numerator * sum_denominator;sum_denominator *= denominator;// 约分中间结果simplify(&sum_numerator, &sum_denominator);}
  • 功能:主函数实现分数求和与结果输出。
  • 逻辑
    1. 输入处理
      • 读取整数 NN 个分数;
      • 将每个分数拆解为分子和分母。
    2. 分数相加
      • 使用公式:
        在这里插入图片描述

      • 更新总分数的分子和分母。

    3. 中间约分
      • 每次相加后调用 simplify,将结果化为最简形式,防止分子和分母增长过快。

4. 结果格式化与输出

    long long integer_part = sum_numerator / sum_denominator;long long fraction_numerator = sum_numerator % sum_denominator;if (fraction_numerator == 0) {printf("%lld\n", integer_part); // 只有整数部分} else {if (integer_part != 0) {printf("%lld %lld/%lld\n", integer_part, fraction_numerator, sum_denominator);} else {printf("%lld/%lld\n", fraction_numerator, sum_denominator);}}
  • 功能:将总和分为整数部分和分数部分,并按要求格式化输出。
  • 逻辑
    1. 整数部分:计算 integer_part = 分子 ÷ 分母
    2. 分数部分:计算 fraction_numerator = 分子 % 分母
    3. 输出规则
      • 如果没有分数部分(即分子能整除分母),直接输出整数
      • 如果没有整数部分(整数部分为 0),仅输出分数
      • 否则输出“整数部分 + 分数部分”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Selenium + 数据驱动测试:从入门到实战!

引言 在软件测试中&#xff0c;测试数据的多样性和灵活性对测试覆盖率至关重要。而数据驱动测试&#xff08;Data-Driven Testing&#xff09;通过将测试逻辑与数据分离&#xff0c;极大地提高了测试用例的可维护性和可扩展性。本文将结合Selenium这一流行的测试工具&#xff0…

RK3568平台(中断篇)ARM中断流程

一.ARM 处理器程序运行的过程 ARM芯片属于精简指令集计算机 (RISC: Reduced Instruction Set Computing),它所用的指令比较简单,有如下特点: ① 对内存只有读、写指令 ② 对于数据的运算是在CPU内部实现 ③ 使用RISC指令的CPU复杂度小一点,易于设计 比如对于 a=a+b 这…

视频修复技术和实时在线处理

什么是视频修复&#xff1f; 视频修复技术的目标是填补视频中的缺失部分&#xff0c;使视频内容连贯合理。这项技术在对象移除、视频修复和视频补全等领域有着广泛的应用。传统方法通常需要处理整个视频&#xff0c;导致处理速度慢&#xff0c;难以满足实时处理的需求。 技术发…

推荐一款专业电脑护眼工具:CareUEyes Pro

CareUEyes Pro是一款非常好用的专业电脑护眼工具&#xff0c;软件小巧&#xff0c;界面简单&#xff0c;它可以自动过滤电脑屏幕的蓝光&#xff0c;让屏幕显示更加的不伤眼&#xff0c;更加舒适&#xff0c;有效保护你的眼睛&#xff0c;可以自定义调节屏幕的色调&#xff0c;从…

Element UI 组件库详解【Vue】

文章目录 一、引言二、安装并使用1. 安装2. 使用 三、常见组件说明1. 基础组件2. 布局组件3. 布局容器4. 选择框组件5. 输入框组件6. 下拉框组件7. 日期选择器8. 上传组件9. 表单组件10. 警告组件11. 提示组件12. 表格组件 一、引言 官方网站&#xff0c;element.eleme.cn El…

相机触发模式

参考自&#xff1a;相机触发模式_硬触发和软触发的区别-CSDN博客 一、图像采集模式分类 相机的图像采集模式分为内触发模式与外触发模式。其中内触发模式包含连续采集、单帧采集两种形式&#xff1b;外触发模式包含软件外触发、硬件外触发。本文以海康相机的软件平台作介绍&a…

脚手架vue-cli,webpack模板

先安装node.js&#xff0c;它是服务器端&#xff0c;用于给页面提供服务。前端学习不需要会node.js&#xff0c;只需要学会node.js衍生出来的npm命令即可。 npm 是node.js的一个工具&#xff0c;作用是进行包管理&#xff0c;npm是node.js的包管理器。 接着安装脚手架&#xff…

Stable Diffusion核心网络结构——CLIP Text Encoder

&#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&…

ggplot2 分面图等添加注释文字,相加哪里加哪里: 自定义函数 AddText()

如果分面图上还想再添加文字&#xff0c;只能使用底层的grid包了。 函数定义 # Add text to ggplot2 figures # # param label text you want to put on figure # param x position x, left is 0, right 1 # param y position y, bottom is 0, up 1 # param color text color…

ubuntu中使用ffmpeg和nginx推流rtmp视频

最近在测试ffmpeg推流rtmp视频&#xff0c;单独安装ffmpeg是无法完成推流的&#xff0c;需要一个流媒体服务器&#xff0c;常用nginx&#xff0c;可以直接在ubuntu虚拟机里面测试一下。 测试过程不涉及编译ffmpeg和nginx&#xff0c;仅使用基本功能&#xff1a; 1 安装ffmpeg …

解决upload上传之后,再上传没有效果

解决upload上传之后&#xff0c;再上传没有效果 注释&#xff1a;这是第二次上传&#xff0c;两次网络请求都是第一次上传的&#xff0c;这次上传没有网络请求 原因&#xff1a;在我的代码里我限制了上传数量为1&#xff0c;然后上传成功后&#xff0c;上传列表没有清空&#…

NVR接入录像回放平台EasyCVR视频融合平台加油站监控应用场景与实际功能

在现代社会中&#xff0c;加油站作为重要的能源供应点&#xff0c;面临着安全监管与风险管理的双重挑战。为应对这些问题&#xff0c;安防监控平台EasyCVR推出了一套全面的加油站监控方案。该方案结合了智能分析网关V4的先进识别技术和EasyCVR视频监控平台的强大监控功能&#…

基于web的音乐网站(Java+SpringBoot+Mysql)

目录 1系统概述 1.1 研究背景 1.2研究目的 1.3系统设计思想 2相关技术 2.1 MYSQL数据库 2.2 B/S结构 2.3 Spring Boot框架简介 3系统分析 3.1可行性分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2系统性能分析 3.2.1 系统安全性 3.2.2 数据完整性 …

中间件--laravel进阶篇

laravel版本11.31,这中间件只有3种,分别是全局中间件,路由中间件,控制器中间件。相比thinkphp8,少了一个应用中间件。 一、创建中间件 laravel创建中间件可以使用命令的方式创建,非常方便。比如php artisan make:middleware EnsureTokenIsValid。EnsureTokenIsValid是中间…

杰发科技AC7840——EEP中RAM的配置

sample和手册中示例代码的sram区地址定义不一样 这个在RAM中使用没有限制&#xff0c;根据这个表格留下足够空间即可 比如需要4096字节的eep空间&#xff0c;可以把RAM的地址改成E000&#xff0c;即E000-EFFF&#xff0c;共4096bytes即可。

实验室管理平台:Spring Boot技术构建

3系统分析 3.1可行性分析 通过对本实验室管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本实验室管理系统采用SSM框架&#xff0c;JAVA作为开发语言&a…

ThinkPHP8使用workerman

应用场景说明&#xff1a;通过建立通信&#xff0c;不同用户进行消息推送或数据更新&#xff0c;因为本身需要作为服务端进行主动消息推送&#xff0c;因此使用Gateway方式&#xff0c;如果不需要的可以不采用这种形式&#xff0c;以下内容仅为参考&#xff0c;具体业务场景&am…

【USB】CC检测

CC信号有两根线&#xff0c;CC1和CC2&#xff0c;大部分USB线&#xff08;不带芯片的线缆&#xff09;里面只有一根CC线&#xff0c;DFP可根据两根CC线上的电压&#xff0c;判断是否已经插入设备。通过判断哪根CC线上有下拉电阻来判断方向&#xff0c;下图的说明已经非常清晰。…

「一」HarmonyOS端云一体化概要

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…

三种复制只有阅读权限的飞书网络文档的方法

大家都知道&#xff0c;飞书是一款功能强大的在线协作工具&#xff0c;可以帮助团队更高效地协作和沟通。越来越多的资料都在使用飞书文档&#xff0c;在使用飞书的过程中&#xff0c;发现很多文档没有复制权限&#xff0c;如果想要摘抄笔记&#xff0c;只能一个字一个字地敲出…