【Go语言入门100题】009 N个数求和 (20 分) Go语言|Golang

简介: L1-009 N个数求和 (20 分)Go语言|Golang本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

L1-009 N个数求和 (20 分)Go语言|Golang

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。


输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。


输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。


输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

结尾无空行


输出样例1:

3 1/3


结尾无空行


输入样例2:

2
4/3 2/3


结尾无空行


输出样例2:

2

结尾无空行


输入样例3:

3
1/3 -1/6 1/8


结尾无空行


输出样例3:

7/24


结尾无空行


思路:

先通分,判断它通分加和之后是不是一个假分数。

如果是,输出分子/分母,以及分子%分母,及分母(强行凑出题目要求的带分数)

否则判断是否能整除,能则直接输出一个整数,不能则直接输出分子/分母。注意舍弃掉0!

但是只拿了15分。。我麻了。。第三和第五个测试点过不了,日后再调试。大佬们可以帮我看看。


代码如下:

package main
import (
  "fmt"
  "strconv"
  "strings"
)
func main() {
  var num int
  var str1 string
  _, _ = fmt.Scan(&str1)
  tmp := strings.Split(str1,"/")  // 初始的第一个分数
  a,_:=strconv.Atoi(tmp[0])
  b,_:=strconv.Atoi(tmp[1])
  t := div(a,b)  //最大公约数
  if a>0 {
    a /= t
    b /= t
  }
  _,_=fmt.Scan(&num)
  for i:=1;i<num;i++{
    var str string
    _, _ = fmt.Scan(&str)
    tmpList := strings.Split(str,"/") // 第一个分数与第二个分数进行计算
    c,_:=strconv.Atoi(tmpList[0])
    d,_:=strconv.Atoi(tmpList[1])
    lcp := b*d/div(b,d)     //通过最大公约数换算出两个分母的最小公倍数
    a = a * lcp/b + c*lcp/d   //通分后分子和
    b = lcp
    t1 := div(a,b)
    if t1 != 0 {        //从扩大最小公倍数之后的形式变换回来
      a = a / t1        //再和上面的新输入的c,d参与计算,进行不断的迭代
      b = b / t1
    }
  }
  //下面就是迭代完的结果了
  if a>0 && a/b==0 {        //如果 a>0 就是说明分子大于0,
    fmt.Printf("%d/%d",a%b,b)
  }else if a%b==0{        // 如果刚好可以取整数,就直接输出整数
    fmt.Printf("%d\n",a/b)
  }else{
    fmt.Printf("%d %d/%d",a/b,a%b,b)
  }
}
func div(a,b int)int{     //最大公约数
  if a<b {
    a,b = b,a
  }
  temp := a%b       //保证大的对小的取余,所以才有上面的判断
  for temp!=0 {       //保证找到的temp是大于零且是最小的
    a=b
    b=temp   // 不断进行取余操作,直到最小为止
    temp=a%b
  }
  return b
}
相关文章
|
2月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
116 4
Golang语言之管道channel快速入门篇
|
2月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
104 3
Golang语言之gRPC程序设计示例
|
2月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
86 4
|
14天前
|
存储 设计模式 安全
Go语言中的并发编程:从入门到精通###
本文深入探讨了Go语言中并发编程的核心概念与实践技巧,旨在帮助读者从理论到实战全面掌握Go的并发机制。不同于传统的技术文章摘要,本部分将通过一系列生动的案例和代码示例,直观展示Go语言如何优雅地处理并发任务,提升程序性能与响应速度。无论你是Go语言初学者还是有一定经验的开发者,都能在本文中找到实用的知识与灵感。 ###
|
18天前
|
存储 Cloud Native Shell
go库介绍:Golang中的Viper库
Viper 是 Golang 中的一个强大配置管理库,支持环境变量、命令行参数、远程配置等多种配置来源。本文详细介绍了 Viper 的核心特点、应用场景及使用方法,并通过示例展示了其强大功能。无论是简单的 CLI 工具还是复杂的分布式系统,Viper 都能提供优雅的配置管理方案。
|
18天前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
19天前
|
Serverless Go
Go语言中的并发编程:从入门到精通
本文将深入探讨Go语言中并发编程的核心概念和实践,包括goroutine、channel以及sync包等。通过实例演示如何利用这些工具实现高效的并发处理,同时避免常见的陷阱和错误。
|
1月前
|
安全 Go 开发者
破译Go语言中的并发模式:从入门到精通
在这篇技术性文章中,我们将跳过常规的摘要模式,直接带你进入Go语言的并发世界。你将不会看到枯燥的介绍,而是一段代码的旅程,从Go的并发基础构建块(goroutine和channel)开始,到高级模式的实践应用,我们共同探索如何高效地使用Go来处理并发任务。准备好,让Go带你飞。
|
1月前
|
存储 安全 Go
Go语言切片:从入门到精通的深度探索###
本文深入浅出地剖析了Go语言中切片(Slice)这一核心概念,从其定义、内部结构、基本操作到高级特性与最佳实践,为读者提供了一个全面而深入的理解。通过对比数组,揭示切片的灵活性与高效性,并探讨其在并发编程中的应用优势。本文旨在帮助开发者更好地掌握切片,提升Go语言编程技能。 ###
|
2月前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
53 4
Golang语言goroutine协程篇