zoukankan      html  css  js  c++  java
  • 数论 a+b=n与lcm(a, b)=m

    // 本文主要参考   https://blog.csdn.net/Shinaria/article/details/79049838

    //部分参考  https://blog.csdn.net/acoolgiser/article/details/81188440

    题目是这样的:

    给定两个正整数n和m,找到满足条件的合适的a和b:

    1. a+b=n

    2.lcm(a, b)=m

    神奇的是 由 1,2可得   gcd(a,b)==gcd(n,m)

    证明:设 gcd(a,b)=g

    则 a=a' * g        b=b' * g       其中 a',b' 互质且无需在乎其大小

    所以 由 lcm 与 gcd 的关系可得

       m=g * a' * b'

      n=g*(a' + b')  

    易证: a' * b'  和  (a' + b')   互质,因为能 整除 a' *+ b' ,就只有能同时整除a' 和整除b',但 两者是互质的

    所以证毕。

    另外在做这道题时,需要用到 sqrt 函数,当时我并没有认真考虑根号下是负数的情况,在我看了别人的代码时才想到这一点。

    但其实是没必要考虑的,因为 sqrt 函数在处理负数时会 返回  -nan(ind)  

    nan  是 "not a number"  的缩写,  即计算结果 不是个 数。

    ind 是 indeterminate  的缩写,即无法确定 是什么。

    对负数开平方,对负数取对数,0.0除以0.0,0.0乘无穷大∞,  无穷大∞除以无穷大∞  等错误都会 得 到 它。

    我在 math.h的头文件里 找到了其函数声明   _Check_return_ _CRT_JIT_INTRINSIC double __cdecl sqrt(_In_ double _X);

    具体看不懂,不过可以知道,其形参和返回值都是 double 类型

    于是在 vs2015上试了一下

            int a = -4;
        printf("%lf
    ", (double)sqrt((a)));
        printf("%lf
    ", (double)sqrt(double(-4)));
        printf("%d
    ", (double)sqrt(double(-4)));
        printf("%d", (int)sqrt(double(-4)));                

    结果是:

    -nan(ind)
    -nan(ind)
    0
    -2147483648

    我不太明白为什么 int 不报错 ,猜测是发生了隐式转换吧,这个不太懂。

    好吧,就这样。

      

  • 相关阅读:
    window.print()分页打印
    获取输入框中光标位置
    JavaScript数据结构与算法描述-队列
    .NET中获取IP地址
    记录一次排查C#使用UI Automation获取程序元素的bug
    虚拟机为win server 2012 添加新磁盘
    为halo博客添加ssl证书(配合nginx反向代理)
    初学nginx反向代理
    公告时间轴
    hackthebox-Archetype
  • 原文地址:https://www.cnblogs.com/asdfknjhu/p/12113411.html
Copyright © 2011-2022 走看看