数论 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\n", (double)sqrt((a)));
    printf("%lf\n", (double)sqrt(double(-4)));
    printf("%d\n", (double)sqrt(double(-4)));
    printf("%d", (int)sqrt(double(-4)));                

结果是:

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

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

好吧,就这样。

 

 

  

上一篇:ca48a_demo_c++_for循环语句


下一篇:Codeforces 144A