// 本文主要参考 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 不报错 ,猜测是发生了隐式转换吧,这个不太懂。
好吧,就这样。