最大公约数和最小公倍数及其应用(Go语言解法)
最大公约数(greatest common divisor)欧几里得辗转相除法:gcd(x,y)表示x和y的最大公约数进入运算时:x!=0,y!=0,本质上就是不断转换成求等价更小数的最大公约数。如果x%y=0,返回y,即最大公约数。gcd(x,y)=gcd(y,x%y)证明:设k=x/y,b=x%y 则:x=ky+b如果n能够同时整除x和y,则(y%n)=0,(ky+b)%n=0,则b%n=0,即n也同时能够整除y和b。由上得出:同时能够整除y和(b=x%y)的数,也必然能够同时整除x和y。故而gcd(x,y)=gcd(y,x%y)。当(b=x%y)=0,即y可以整除x,这时的y也就是所求的最大公约数了。附上两条重要性质:gcd(a,b)=gcd(b,a),gcd(-a,b)=gcd(a,b)最小公倍数(least common multiple)公式解法:最小公倍数=两数之积/最大公约数
package main
import (
"fmt"
)
/*
*穷举法:最大公约数
*/
func gcdNormal(x, y int) int {
var n int
if x > y {
n = y
} else {
n = x
}
for i := n; i >= 1; i-- {
if x%i == 0 && y%i == 0 {
return i
}
}
return 1
}
/*
*辗转相除法:最大公约数
*递归写法,进入运算是x和y都不为0
*/
func gcd(x, y int) int {
tmp := x % y
if tmp > 0 {
return gcd(y, tmp)
} else {
return y
}
}
/*
*辗转相除法:最大公约数
*非递归写法
*/
func gcdx(x, y int) int {
var tmp int
for {
tmp = (x % y)
if tmp > 0 {
x = y
y = tmp
} else {
return y
}
}
}
/*
*穷举写法:最小公倍数
*/
func lcmNormal(x, y int) int {
var top int = x * y
var i = x
if x < y {
i = y
}
for ; i <= top; i++ {
if i%x == 0 && i%y == 0 {
return i
}
}
return top
}
/*
*公式解法:最小公倍数=两数之积/最大公约数
*/
func lcm(x, y int) int {
return x * y / gcd(x, y)
}
func main() {
x, y := 12, 15
fmt.Println("gcdNormal=", gcdNormal(x, y))
fmt.Println("gcd=", gcd(x, y))
fmt.Println("gcdx=", gcdx(x, y))
fmt.Println("nlcmNormal=", lcmNormal(x, y))
fmt.Println("lcm=", lcm(x, y))
}
复制代码
猜生日问题:
小明对生日十分看重,因为他可以得到祝福,可以和朋友亲人一起分享快乐,可以为自己的人生做一次总结,并且...能够收到好多礼物!
不过小明是个神秘的人,不会轻易告诉你他的生日,现在他想到一个办法,让你去猜他的生日是哪一天。
小明会告诉你如下三个信息:
1. 出生月份和出生日子的最大公约数;
2. 出生月份和出生日子的最小公倍数;
3. 出生年份;
现在要求你猜出小明的生日。
Input
第一行输入一个正整数T,表示总共有T组册数数据(T <= 200);
对于每组数据依次输入三个数x,y,z,
x表示出生月份和出生日子的最大公约数(1<= x <=1000);
y表示出生月份和出生日子的最小公倍数(1<= y <=1000);
z表示出生年份(1900 <= z <= 2013)。
每组输入数据占一行。
Output
package main
import (
"fmt"
)
/*
*穷举法:最大公约数
*/
func gcdNormal(x, y int) int {
var n int
if x > y {
n = y
} else {
n = x
}
for i := n; i >= 1; i-- {
if x%i == 0 && y%i == 0 {
return i
}
}
return 1
}
/*
*辗转相除法:最大公约数
*递归写法,进入运算是x和y都不为0
*/
func gcd(x, y int) int {
tmp := x % y
if tmp > 0 {
return gcd(y, tmp)
} else {
return y
}
}
/*
*辗转相除法:最大公约数
*非递归写法
*/
func gcdx(x, y int) int {
var tmp int
for {
tmp = (x % y)
if tmp > 0 {
x = y
y = tmp
} else {
return y
}
}
}
/*
*穷举写法:最小公倍数
*/
func lcmNormal(x, y int) int {
var top int = x * y
var i = x
if x < y {
i = y
}
for ; i <= top; i++ {
if i%x == 0 && i%y == 0 {
return i
}
}
return top
}
/*
*公式解法:最小公倍数=两数之积/最大公约数
*/
func lcm(x, y int) int {
return x * y / gcd(x, y)
}
func main() {
x, y := 12, 15
fmt.Println("gcdNormal=", gcdNormal(x, y))
fmt.Println("gcd=", gcd(x, y))
fmt.Println("gcdx=", gcdx(x, y))
fmt.Println("nlcmNormal=", lcmNormal(x, y))
fmt.Println("lcm=", lcm(x, y))
}
复制代码 猜生日问题: 小明对生日十分看重,因为他可以得到祝福,可以和朋友亲人一起分享快乐,可以为自己的人生做一次总结,并且...能够收到好多礼物! 不过小明是个神秘的人,不会轻易告诉你他的生日,现在他想到一个办法,让你去猜他的生日是哪一天。 小明会告诉你如下三个信息: 1. 出生月份和出生日子的最大公约数; 2. 出生月份和出生日子的最小公倍数; 3. 出生年份; 现在要求你猜出小明的生日。 Input 第一行输入一个正整数T,表示总共有T组册数数据(T <= 200); 对于每组数据依次输入三个数x,y,z, x表示出生月份和出生日子的最大公约数(1<= x <=1000); y表示出生月份和出生日子的最小公倍数(1<= y <=1000); z表示出生年份(1900 <= z <= 2013)。 每组输入数据占一行。 Output 对于每组数据,先输出Case数。 如果答案不存在 ,输出“-1”; 如果答案存在但不唯一 ,输出“1”; 如果答案唯一,输出生日,日期格式为YYYY/MM/DD; 直接给出Go语言实现代码(为便于测试输入问题已忽略)
package main
import (
"fmt"
)
/*检查如期是否合法*/
func checkDate(y, m, d int) int {
var arr [13]int = [13]int{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
//闰年
if (y%4 == 0 && y%100 != 0) || y%400 == 0 {
arr[2] = 29
}
if arr[m] < d {
return 0
}
return 1
}
/*
*已知x和y的最小公倍数min和最大公约数max,求x和y
*由最小公倍数性质:min=x*y/max,所以x*y=max*min
*由最大公约数性质:x和y都可以写成max*n
*/
func rgcd(min, max, y int, m, d *int) int {
var mMax, dMax, res, count, tmp int = 12 / max, 31 / max, min * max, 0, 0
for i := 1; i <= mMax; i++ {
for j := 1; j <= dMax; j++ {
tmp = max * i * max * j
if tmp > res {
break
} else if tmp == res {
//计算得到的日期的合法,才加上
tmpM := max * i
tmpD := max * j
if checkDate(y, tmpM, tmpD) == 1 {
*m = tmpM
*d = tmpD
//fmt.Println(*m, *d)
count++
}
}
}
}
if count > 1 {
return 1
} else if count == 1 {
return 0
} else {
return -1
}
}
func main() {
min, max, y, m, d := 24, 3, 1999, 0, 0
fr := rgcd(min, max, y, &m, &d)
if fr == 0 {
fmt.Printf("%d/%02d/%02d", y, m, d)
} else {
fmt.Println(fr)
}
}
复制代码最小公倍数, 公约数
- MongoDB aggregation $unwind
- spring data mongodb 代码连接数据库方式
- spring data mongodb dbref 关联查询
- spring-data-mongodb mapreduce使用
- 项目中如何设计通用的评论模块
- java8 stream
- spring boot中自定义错误提示页面
- spring boot中删除Data MongoDB的_class
- 用aop加redis实现通用接口缓存
- spring boot 实现mysql读写分离
- spring boot集成druid连接池
- spring boot整合dubbox进行服务拆分
- Spring Cloud中如何保证各个微服务之间调用的安全性
- Spring Boot Actuator监控页面报错解决
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- String、StringBuffer、StringBuiler深入分析,看这一篇就够了
- Windows安装pip方法
- 通过jvm字节码研究Synchronized
- 学synchronized锁升级过程,吊打面试官
- jvm启动加载类的全过程,全网最全一篇,告诉你什么是双亲委派机制
- sonar+Jenkins 构建代码质量自动化分析平台
- 几百行代码,实现了微信群聊,神奇!
- 深入解析==与equals()区别
- 工作中常用的十款idea插件
- Linux系统rsync数据同步服务介绍
- 清空表与删除表mysql
- Java虚拟机-JVM组成结构详解
- 解决Chunkize warning while installing gensim问题
- numpy的random模块
- MySQL如何快速生成千万数据量?