• 数论 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 不报错 ,猜测是发生了隐式转换吧,这个不太懂。

    好吧,就这样。

      

  • 相关阅读:
    QT 捕获事件(全局拦截)
    QT语言翻译
    QT,QLabel添加超链接
    解决VS+Qt不生成moc文件问题
    c++编译错误:invalid new-expression of abstract class type
    C++ 异常处理
    MATLAB 随机生成互不重叠的多个矩形
    sequential minimal optimization,SMO for SVM, (MATLAB code)
    How to decide on the correct number of clusters?
    python 将数据随机分为训练集和测试集
  • 原文地址:https://www.cnblogs.com/asdfknjhu/p/12113411.html
Copyright © 2020-2023  润新知