码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【每日一练】勾股定理困难版


    目录

    • 题目
    • 官方给的解题思路
    • 源代码
    • 附
      • 最大公因数
        • 辗转相除法
        • 更相减损术
      • 所有因数
      • 参考文献

    题目

    给定斜边z的值,求所有直角边x和y的组合数(x、y和z都是正整数)。
    仅有一行输入,即斜边z的值(z是正整数,且z<10000000000000000000)
    输出x和y的组合数(x和y是正整数)
    时间限制:1000ms
    内存限制:256M

    官方给的解题思路

    在这里插入图片描述

    源代码

    根据官方思路,编的第一版:

    def main(c):
        group = set()
        g_list = get_factor(2*c)
        for g in g_list:
            n = (2*c)/g
            for x1 in range(1, int(n**0.5)+1):
                y1 = (n - x1**2)**0.5
                _y1 = y1 - int(y1)
                if _y1 == 0 and y1 > x1:
                    x = g*x1**2
                    y = g*y1**2
                    a = int((x*y)**0.5)
                    b = int((y-x)/2)
                    group.add((a, b))
        return len(group)
    
    def get_factor(n):
        r = []
        x = 1
        while x < n:
            if n % x == 0:
                r.append(x)
            x += 1
        return r
    
    if __name__=='__main__':
        z = input()
        nums = main(int(z))
        print(nums)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    根据官方思路,编的第二版,修改了计算因数部分的代码,代码通过~

    def main(c):
        group = set()
        g_list = get_factor(2*c)
        for g in g_list:
            n = (2*c)/g
            for x1 in range(1, int(n**0.5)+1):
                y1 = (n - x1**2)**0.5
                _y1 = y1 - int(y1)
                if _y1 == 0 and y1 > x1:
                    x = g*x1**2
                    y = g*y1**2
                    a = int((x*y)**0.5)
                    b = int((y-x)/2)
                    group.add((a, b))
        print(group)
        return len(group)
    
    def get_factor(c):
        r = []
        x = 1
        while x <= c**0.5:
            if c % x == 0:
                r.append(x)
                if c//x != x:
                    r.append(c//x)
            x += 1
        return r
    
    if __name__=='__main__':
        z = input()
        nums = main(int(z))
        print(nums)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在这里插入图片描述

    附

    最大公因数

    辗转相除法

    又名欧几里得算法(Euclidean algorithm),目的是求出两个正整数的最大公约数。
    两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。比如10和25,25除以10商2余5,那么10和25的最大公约数,等同于10和5的最大公约数。

    def gcd(a, b):
        m = max(a, b)
        n = min(a, b)
        r = m % n
        while r != 0:
            m = n
            n = r
            r = m % n
        return n
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    更相减损术

    出自于中国古代的《九章算术》,也是一种求最大公约数的算法。
    两个正整数a和b(a>b),它们的最大公约数等于a-b的差值c和较小数b的最大公约数。比如10和25,25减去10的差是15,那么10和25的最大公约数,等同于10和15的最大公约数。

    def gcd(a, b):
        while a != b:
            if a > b:
                a -= b
            else:
                b -= a
        return a
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    所有因数

    def get_factor(c):
        r = []
        x = 1
        while x <= c**0.5:
            if c % x == 0:
                r.append(x)
                if c//x != x:
                    r.append(c//x)
            x += 1
        return r
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    参考文献

    https://bbs.csdn.net/topics/616088159
    密码学学习笔记 之 数论四大定理及应用

  • 相关阅读:
    【Python/crawl】如何使用Python爬虫将一系列网页上的同类图片下载到本地
    Prompt提示词——什么是CRISPE框架?QCIPSPE框架?
    Java.lang.Class类 getSimpleName()方法有什么功能呢?
    Java方法和数组练习
    网络参考模型与标准协议(一)
    【头歌-Python】8.3 政府工作报告数据提取(project)-第4关
    设计模式【5】——观察者模式
    对抗生成网络(GAN)中的损失函数
    客户管理系统(SSM版):查看交易明细
    【一起学数据结构与算法】时间复杂度_空间复杂度
  • 原文地址:https://blog.csdn.net/qq_25262697/article/details/133688973
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号