PTA L1-009 N个数求和 【C++】【辗转相除法】【Python】

news2024/12/28 4:45:17

C++:

辗转相除法

每次算最小公倍数和最大公约数都是用的常规思路,本身是不会有错的,但是当数据很大时,就会出现错误,时间复杂度过高

辗转相除法,又称欧几里德算法(Euclidean Algorithm),是求两个数的最大公约数(greatest common divisor)的一种方法。用较大的数除以较小的数,再以除数和余数反复做除法运算,当余数为0时,取当前算式除数为最大公约数

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

例:求38与18的最大公约数

30 / 18 = 1 余 12

18 / 12 = 1 余 6

12 /   6 = 2 余 0

当a<b时其实也是一样的,只不过多了一步

18 / 30 = 0 余 18

30 / 18 = 1 余 12

18 / 12 = 1 余 6

12 /   6 = 2 余 0

格式化输入:

一开始尝试了很多方法,包括头文件,转换成流,分割字符串,但是都很复杂,因为涉及到字符串到字符到整型的转换

本题的输入有两种简单巧妙的方法:

1.采用string里的getchar()略过每个数后面的字符(斜杠或者空格)

int N;
    cin>>N;
    int number[N*2];
    for(int i=0; i<N*2; i++){
    	cin>>number[i];
    	getchar();
	}

2.cin.ignore()忽视两个整数之间的斜杠,而cin是不会读入空格的

for (int i = 0; i < N; i++) 
	{
        cin >> numerators[i];
        cin.ignore(); // 忽略分数中的斜杠
        cin >> denominators[i];
    }

注意点:

测试点三主要是考察边界,当数字很大时的情况,有两种可能是通过不了测试的

1.先全部通分相加,再约分(数据溢出)

2.没有使用long long int型

输出时注意分类讨论

本题代码

#include <iostream>
#include <vector>

using namespace std;

// 返回两个数的最大公约数
long long int gcd(long long int a,long long  int b) {
    return b == 0 ? a : gcd(b, a % b);
}

// 返回两个数的最小公倍数
long long int lcm(long long int a,long long int b) {
    return a * b / gcd(a, b);
}
/* 
//注释掉的为常规思路,但是当数字很大时,时间复杂度过高 
// 返回两个数的最大公约数
long long int gcd(long long int a,long long  int b) {
    int k=1;
    for(int i=2;i<=(a<b?a:b);i++){
        while(a%i==0 && b%i==0){
            a/=i;
            b/=i;
            k*=i;
        }//注意是循环不是判断
    }
    return k; 
}

// 返回两个数的最小公倍数
long long int lcm(long long int a,long long int b) {
    return a*b/gcd(a,b);
}
*/ 
int main() {
    int N;
    cin >> N;
    if(N==0)
    {
    	cout<<0;
    	return 0;
	}
	//两个动态数组 
    vector<int> numerators(N), denominators(N);
	//格式化读入数据 
    for (int i = 0; i < N; i++) 
	{
        cin >> numerators[i];
        cin.ignore(); // 忽略分数中的斜杠
        cin >> denominators[i];
    }

    // 初始化和的分子和分母为第一个分数
    long long int sum_numerator = numerators[0];
    long long int sum_denominator = denominators[0];

    for (int i = 1; i < N; i++) 
	{
        // 通分
        long long int common_denominator = lcm(sum_denominator, denominators[i]);
        sum_numerator = sum_numerator * (common_denominator / sum_denominator) + numerators[i] * (common_denominator / denominators[i]);
        sum_denominator = common_denominator;
        
        // 约分
        long long int common_factor = gcd(sum_numerator, sum_denominator);
        sum_numerator /= common_factor;
        sum_denominator /= common_factor;
    }

    // 输出结果分类讨论 
    if (sum_denominator == 1 || sum_numerator == 0) 
	{
        cout << sum_numerator;
    } 
	else 
	{
    	//提出整数部分,使分子小于分母 
    	if(sum_numerator/sum_denominator!=0)
    	{ 
    		cout<<sum_numerator/sum_denominator<<' ';
    	} 
    	sum_numerator %= sum_denominator;
    	if(sum_numerator)
    	{ 
        	cout << sum_numerator << '/' << sum_denominator;
        } 
    }
    return 0;
}

Python:

注意点:

1.split分割字符串默认得到列表,所以要转换为整型

2.计算默认为浮点型,输出也要转换

# n个数相加
# 输入
# 5
# 2/5 4/15 1/30 -2/60 8/3
# 输出
# 3 1/3

# 最大公约数
def gcd(a, b):
    if b == 0:
        return a
    else:
        return gcd(b, a % b)


# 最小公倍数
def lcm(a, b):
    return a * b / gcd(a, b)


N = int(input())
lst = list(map(str,input().split(' ')))
# ['2/5', '4/15', '1/30', '-2/60', '8/3']
lst2=[]
for i in lst:
    lst2.append(i.split('/'))  # ['2', '5']
sum_a, sum_b = int(lst2[0][0]), int(lst2[0][1])
for i in range(1, N):
    # 通分
    b_common = lcm(sum_b, int(lst2[i][1]))
    sum_a = sum_a * (b_common / sum_b) + int(lst2[i][0]) * (b_common / int(lst2[i][1]))
    sum_b = b_common
    # 约分
    the_common = gcd(sum_a, sum_b)
    sum_a /= the_common
    sum_b /= the_common
if sum_a == 0 or sum_b == 1:
    print(int(sum_a))
else:
    if sum_a // sum_b > 0:
        print(int(sum_a // sum_b),end=' ')
        sum_a = sum_a % sum_b
    if sum_a != 0:
        print(f"{int(sum_a)}/{int(sum_b)}")

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

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

相关文章

解决IDEA https://start.spring.io/连接不上

1.换成下边这个地址试试 https://start.springboot.io/2.换成阿里云试试&#xff0c;绝对可行&#xff0c;但是版本有点低 https://start.aliyun.com

BackTrader 中文文档(二)

原文&#xff1a;www.backtrader.com/ 概念 平台概念 原文&#xff1a;www.backtrader.com/docu/concepts/ 这是平台某些概念的集合。它试图收集可在使用平台时有用的信息片段。 开始之前 所有小代码示例都假设以下导入可用&#xff1a; import backtrader as bt import ba…

用一个寓言故事讲明白KMP算法

在讲寓言故事之前&#xff0c;先讲一下理论的前提知识&#xff0c;避免有些0基础而无法理解 前提知识 首先KMP算法是指在串中&#xff0c;想要快速找出主串里跟我们的模板串一样的位置的一种算法&#xff0c;其主要是解决最普通的BF算法中主串指针回溯的问题。 BF算法就是一…

原生支付宝小程序 - 获取“dom“元素

在支付宝中是不能获取到dom元素的&#xff0c;但是我门可以借助my.createSelectorQuery来实现 Page({data:{sq:{}},onLoad(){},onShow(){this.setData({sq: my.createSelectorQuery()})} })通过axml来查看 <view>{{sq}} </view>会发现它只是一个Object&#xff0…

2024华中杯A题完整1-3问py代码+完整思路16页+后续参考论文

A题太阳能路灯光伏板朝向问题 &#xff08;完整版资料文末获取&#xff09; 第1小问&#xff1a;计算每月15日的太阳直射强度和总能量 1. 理解太阳直射辐射和光伏板的关系**&#xff1a;光伏板接收太阳辐射并转化为电能&#xff0c;直射辐射对光伏板的效率影响最大。 2. 收集…

ssm058基于Java的共享客栈管理系统+jsp

共享客栈管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对房屋出租信息管理混乱&#xff0c;出…

电脑技巧:如何把Edge浏览器扩展程序打包安装到其他浏览器

目录 1、进入浏览器扩展界面 2、找到Edge浏览器扩展插件的路径 3、找到需要扩展的插件ID 4、打开浏览器扩展插件目录 5、进入打包扩展界面 6、 安装到其他浏览器 大家日常使用浏览器的时候通常会安装很多浏览器插件&#xff0c;从而大大提升我们的办公效率&#xff0c;有…

通义灵码使用教程:探索AI编码的新维度

一、概述 介绍 通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力&#xff0c;并针对阿里云的云服务使用场景…

实战:源码编译安装mariadb(10.2.19)-2024.4.18(测试成功)

目录 文章目录 目录实验环境实验软件安装相关依赖包做准备用户和数据目录准备数据库目录源码编译安装下载并解压缩源码包源码编译安装mariadb 准备环境变量生成数据库文件准备配置文件准备启动脚本,并启动服务安全初始化测试关于我最后 实验环境 centos7.6 1810 mariadb(10.2.…

CTFshow-PWN-前置基础(pwn20)

提交ctfshow{【.got表与.got.plt是否可写(可写为1&#xff0c;不可写为0)】,【.got的地址】,【.got.plt的地址】 前置基础知识&#xff1a; .got 和 .got.plt 是 ELF&#xff08;Executable and Linkable Format&#xff0c;可执行和可链接格式&#xff09;二进制文件中的两个…

OpenHarmony UI动画-rebound

简介 rebound是一个模拟弹簧动力学&#xff0c;用于驱动物理动画的库。 下载安装 ohpm install ohos/reboundOpenHarmony ohpm环境配置等更多内容&#xff0c;请参考如何安装OpenHarmony ohpm 使用说明 import rebound from ohos/rebound;功能一&#xff1a;创建维护弹簧对…

IP归属地在电商行业中的重要性

IP归属地在电商行业中的应用十分广泛且深入&#xff0c;其重要性不容忽视。它不仅是用户身份验证和地理位置识别的重要手段&#xff0c;还在个性化推荐、库存管理、物流优化以及欺诈检测等多个方面发挥着关键作用。 首先&#xff0c;IP归属地用于身份验证和安全控制。在电商交易…

2024年免费云服务器推荐,小编亲测好用!

随着云计算技术的飞速发展&#xff0c;云服务器以其弹性、高效、安全的特性&#xff0c;成为众多企业和个人用户的首选。尽管市面上有众多收费的云服务器产品&#xff0c;但免费的云服务器仍然吸引着大量用户&#xff0c;尤其是初学者和预算有限的用户。下面&#xff0c;我们就…

以太网24位应变/桥式数据采集卡,替代NI 9237

1.特性简介 XM-BRG是一款以太网型高速应变片压力桥信号采集卡&#xff0c;具有8通道(-4型为4通道)真差分输入&#xff0c;24位分辨率&#xff0c;单通道最高采样率102.4ksps八通道同步共计819.2ksps(-4型为409.6ksps)、精密前置增益放大、集成桥式传感器所需的激励源硬件支持的…

DNS服务器配置与管理(2)——BIND部署DNS

在Linux上配置DNS的常用软件是BIND&#xff08;Berkeley Internet Name Domain Service&#xff0c;BIND&#xff09;&#xff0c;它是一款实现DNS服务器的开放源码软件。本文详细介绍了在CentOS7上安装并配置Bind软件。 一、Bind软件介绍 BIND包最初是在 1980 年代初在加州大…

剑指Offer题目笔记33(并查集)

面试题116&#xff1a; 解决方案&#xff1a; ​ 一个班级可以包含一个或多个朋友圈&#xff0c;对应的图中可能包含一个或多个子图&#xff0c;每个朋友圈对应一个子图。因此&#xff0c;这个问题可以转化为如何求图中子图的数目。图的搜索算法可以用来计算图中子图的数目。扫…

3D模型处理的多进程并行【Python】

今天我们将讨论如何使用 Python 多进程来处理大量3D数据。 我将讲述一些可能在手册中找到的一般信息&#xff0c;并分享我发现的一些小技巧&#xff0c;例如将 tqdm 与多处理 imap 结合使用以及并行处理存档。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生…

PLC工业网关,实现PLC联网

在当今工业自动化领域&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;作为控制系统的核心&#xff0c;其稳定性和可靠性至关重要。然而&#xff0c;随着工业互联网和智能制造的快速发展&#xff0c;如何实现PLC的联网通信&#xff0c;提高数据传输效率&#xff0c;成…

URL的绝对路径/相对路

一、URL 浏览器要想发起请求,必须是一个完整的url地址. URL是一个固定格式的字符串 它表达了&#xff1a; 从网络中 哪台计算机&#xff08;domain&#xff09; 中的 哪个程序&#xff08;port&#xff09; 寻找 哪个服务&#xff08;path&#xff09;&#xff0c;并注明了…

数据治理中心DataArts Studio学习

一、什么是DataArts Studio&#xff1f; 数据治理中心DataArts Studio是为了应对上述挑战&#xff0c;针对企业数字化运营诉求提供的具有数据全生命周期管理和智能数据管理能力的一站式治理运营平台&#xff0c;包含数据集成、数据开发、数据架构、数据质量监控、数据资产管理…