最大公约数Greatest Common Divisor(GCD):整数a和b的GCD是指能同时整除a和b的最大整数,记为gcd(a,b)。由于-a的因子和a的因子相同,因此gcd(a, b)= gcd(al, |bl)。编码时只关注正整数的最大公约数。
(1) gcd(a, b)= gcd(a, a+b)= gcd(a, k·a+b)
(2) gcd(ka,kb)=kgcd(a,b)
(3)定义多个整数的最大公约数:gcd(a, b, c)= gcd(gcd(a, b),c)。
(4)若gcd(a, b)= d,则gcd(a/d, b/d)= 1,即a/d与b/d互素。这个定理很重要。
(5) gcd(a+cb, b)= gcd(a, b)
from math import *
print(gcd(15,81)) # 3
# 0与其他数b的最大公约数没有意义,但会输出b
print(gcd(0,44)) # 44
print(gcd(0,0)) # 0
print(gcd(-6,-15)) # 3 所有数的最大公约数都是正数
print(gcd(-17,289)) # 17
print(gcd(17,-289) ) # 17
print(gcd(48,96,120,688))# 8 多个数的公约数
可能输出负数,和库函数不同。若不需要输出负数可以将第二行代码的a改成abs(a)。
注意:一次只能求两个数的最小公倍数,求n个数的需要求n-1次。
def gcd(a, b):
if b==0: return a # 不需要输出负数可以将a改成abs(a)
else: return gcd(b, a%b)
print(gcd(15,81)) # 3
# 第二个数为负数才输出负数
print(gcd(-6,-15)) # -3
print(gcd (-17,289))# 17
print(gcd(17,-289)) # 17

在Python新版本(Python3.9才加入了lcm)中有库函数lcm(),它可以带多个参数。
from math import *
print(lcm(3,6,8,9)) # 72
在Python的旧版本中并没有lcm()函数,自己写一个lcm():
from math import *
def lcm(x, y):
return x*y//gcd(x, y)
题目描述
小张是软件项目经理,他带领 3 个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:
各组的核桃数量必须相同
各组内必须能平分核桃(当然是不能打碎的)
尽量提供满足 1,2 条件的最小数量(节约闹革命嘛)
输入描述
输入一行 a,b,c,都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c<30)。
输出描述
输出一个正整数,表示每袋核桃的数量。
输入输出样例
输入
2 4 5
输出
20
简单题,答案就是三个数字的最小公倍数。
from math import*
def lcm(x, y):
return x//gcd(x, y)*y
a,b,c = map(int,input ().split())
k = lcm(a, b)
print(lcm(k,c))
题目描述
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N 个整数。
现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?
输入描述
输入的第一行包含一个整数 N。
第二行包含 N 个整数 1,2,⋅⋅⋅,A1,A2,⋅⋅⋅,AN。(注意 A1 ∼ AN 并不一定是按等差数列中的顺序给出)
其中,2≤N≤
,0≤
≤
。
输出描述
输出一个整数表示答案。
输入输出样例
输入
5 2 6 4 10 20
输出
10
样例说明: 包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、 18、20。
from math import *
n = int (input())
a = list(map(int,input().split() ))
a. sort () # 原地排序
d = 0 # 初始化公差
for i in range (1, n):
d = gcd (d, a[i]-a[i-1])
if d == 0: # 公差为0
print(n) # 最小长度就是输入的个数
else:
print((a[-1]-a[0])//d + 1) # 最小距离是以输入的数中最小值为第一个数,最大值为最后一个数
# 注:a[-1]-a[0])//d得到多少个间距,长度=间距数+1
题目描述
在课堂上,老师讲解了如何求两个正整数 c1 和 c2 的最大公约数和最小公倍数。现在 Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数 a0,a1,b0,b1,设某未知正整数 x 满足:
x 和 a0 的最大公约数是 a1;
x 和 b0 的最小公倍数是 b1。
Hankson 的“逆问题”就是求出满足条件的正整数 x。但稍加思索之后,他发现这样的 x 并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的 x 的个数。请你帮助他编程求解这个问题。
输入描述
第一行为一个正整数 n,表示有 n 组输入数据。
接下来的 n 行每行一组输入数据,为四个正整数 a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入数据保证 a0 能被 a1 整除,b1 能被 b0 整除。
其中,保证有 1≤a0,a1,b0,b1≤2×
且n≤2000。
输出描述
输出共 n 行。每组输入数据的输出结果占一行,为一个整数。
对于每组数据:若不存在这样的 x,请输出 0;若存在这样的 x,请输出满足条件的 x 的个数;
输入输出样例
输入
2 41 1 96 288 95 1 37 1776输出
6 2
1、暴力法
from math import *
def lcm(x, y):
return x//gcd(x, y)*y
n = int(input())
for i in range(n):
ans = 0
a0,a1,b0,b1 = map(int,input().split())
for x in range(1,b1+1): # x的最大可能值为b1
if gcd (x, a0)==a1 and lcm(x, b0)==b1:
ans +=1
print(ans)
本题n≤2000,x的范围:x≤b1,而b1≤2×,O(n*b1)=4*
,超过蓝桥杯规定的
,故超时了。
from math import*
def lcm(x, y):
return x//gcd (x, y)*y
n = int(input ())
for _ in range (n):
a0, a1, b0, b1 = map(int, input().split())
ans = 0
for x in range(1,int(sqrt(b1))+1): # x是b1的较小因子,所以x小于sqrt(b1),另一个因子y大于sqrt(b1)
if b1 % x ==0: #若b1是x的公倍数
if gcd(x, a0) ==a1 and lcm(x, b0)==b1: ans+=1
y = b1//x
if x==y : continue # 重复了,跳过
if gcd(y, a0)==a1 and lcm(y, b0)==b1: ans+=1
print(ans)
题目描述
X 星球的某个大奖赛设了 M 级奖励。每个级别的奖金是一个正整数。并且,相邻的两个级别间的比例是个固定值。也就是说:所有级别的奖金数构成了一个等比数列。比如:16,24,36,54,其等比值为:3/2
现在,我们随机调查了一些获奖者的奖金数。请你据此推算可能的最大的等比值。
输入描述
第一行为数字 N (0<N<100),表示接下的一行包含 N 个正整数
第二行 N 个正整数 Xi(Xi<109),用空格分开。每个整数表示调查到的某人的奖金数额
输出描述
一个形如 A/B 的分数,要求 A、B 互质。表示可能的最大比例系数 测试数据保证了输入格式正确,并且最大比例是存在的。
输入输出样例
输入
3 1250 200 32
输出
25/4
举例:A={16,128,512,1024},得a=2,即
from math import *
# 辗转相除得到b=1时的a
def gcd_sub(a, b):
if a<b: a,b = b, a # 交换,保证a>b
if b==1: return a
return gcd_sub(b, a//b)
n = int(input())
x = list(set(map(int,input ().split()))) # set有去重的作用,万一输入有相同的数
x.sort ()
n = len(x)
a = []
b =[]
for i in range(1, n):
d = gcd(x[i],x[0]) # 与第一个数求比值
a.append(x[i]//d) # A序列
b.append(x[0]//d) # B序列
n = len(a)
up = a[0] # 分子
down = b[0] # 分母
# 求分子分母的最小公因数
for i in range(1,n):
up = gcd_sub(up, a[i])
down = gcd_sub(down,b[i])
print('%d/%d'%(up, down))
2022年第十三届省赛,填空题,lanaiao0J题号2131
问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
有一个不超过
的正整数 n,知道这个数除以 2 至 49 后的余数如下表所示,求这个正整数最小是多少。
如何减少验证时间?
如何找到一个较大的k?
cnt = 0
tmp=0
for i in range(187,10**17,187):
if i % 49 ==46 and i % 48== 41 and i % 47 == 5 \
and i % 46 == 15 and i % 45 == 29:
cnt += 1
print(i,'k=', i-tmp) # i-tmp是两次满足这五个要求的公差
tmp=i
if cnt > 3: break
# 5458460249 k= 5458460249
# 12590206409 k= 7131746160
# 19721952569 k= 7131746160
# 26853698729 k= 7131746160
先用Python编码求k':得k'=7131746160,故从5458460249开始,步长k=7131746160的等差数列
mod = [0,0,1,2,1,4,5,4,1,2,9,0,5,10,11,14,9,0,11,18,9,11,11,15 ,17,9,23,20,25,16,29,27,25,11,17,4,29,22,37,23,9,1,11,11,33,29,15,5,41,46]
for i in range (5458460249,10**17,7131746160): #开始是5458460249,步长k=7131746160
for a in range(2,50):
if i % a != mod[a]:
break
else: # for else结构: 若for正常结束,运行else语句
print(i) # 输出答案:2022040920220409
break
从表格的第一个数2开始,逐个增加后面的数,找满足条件的n。
1)满足第一个条件,除以2余1的数有:3、5、7、9、...此时步长k= 2。
2)继续满足第二个条件,除以3余2的数,只能从上一步骤的3、5、7、9、...中找,有5、11、17、...
此时步长k =6,为什么k=6?
实际上是LCM: k = lcm(2,3)=6
证明:
设n1和n2满足:
n1= 2a1+1= 3b1+2
n2= 2a2+1 = 3b2+2
n2和n1的差k = n2-n1= 2(a2-a1)= 3(b2-b1)
k是2的倍数,也是3的倍数,那么k是2和3的最小公倍数,k= lcm(2,3)=6。
3)继续满足第三个条件,除以4余1的数,只能从5、11、17、...中找,有5、17、29、...此时步长k = lcm(2,3,4)= 12。
4)继续满足第四个条件,....
逐个检查表格,直到满足表格中所有的条件。
代码计算量极小,只需要对表格中的2~49做48次LCM即可。
from math import *
mod = [0, 0, 1, 2, 1, 4, 5, 4, 1, 2, 9, 0, 5, 10, 11, 14, 9, 0, 11, 18, 9, 11, 11, 15, 17, 9, 23, 20, 25, 16, 29, 27,
25, 11, 17, 4, 29, 22, 37, 23, 9, 1, 11, 11, 33, 29, 15, 5, 41, 46]
ans = 2 + mod[2]
k = 2 # 从第一个数的步长2开始
for i in range(3, 50):
while 1:
if ans % i == mod[i]: # ans是满足前i个数的解
k = lcm(k, int(i)) # 对当前步长k和i做LCM得到新的步长
break
else:
ans += k # ans不满足就累加当前步长k,直到ans满足前i个数的解
print(ans)
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳