题目如下
1/1 + 1/2 + 1/4 + 1/8 + 1/16 + … 每项是前一项的一半,如果一共有20项,求这个和是多少,结果用分数表示出来。
类似:3/2
当然,这只是加了前2项而已。分子分母要求互质。
下面哪一项是错误的?
题目中给出四个选项:
A.
int gcd(int a, int b) { while (b > 0) { int c; c = a % b; a = b; b = c; } return a; } int main() { int a = 1048575; int b = 524288; int c = gcd(a, b); cout << a / c << "/" << b / c << endl; return 0; }
B.
int gcd(int a, int b) { return a % b ? gcd(b, a % b) : b; } int main() { int a = 1048575, b = 524288; int t = gcd(a, b); cout << a / t << "/" << b / t << endl; return 0; }
C.
long pow_2(int b) { long x = 2; long res = 1; while (b > 0) { if (b & 1) res *= x; b >>= 1; x = x * x; } return res; } int gcd(long a, long b) { if (b == 0) return a; return gcd(b, a % b); } int main() { cout << pow_2(20) - 1 << "/" << pow_2(19) << endl; }
D.
long pow_2(int b) { long x = 2; long res = 1; while (b > 0) { if (b & 1) res *= x; b >>= 1; x = x * x; } return res; } int gcd(long a, long b) { if (b == 0) return a; return gcd(b, a % b); } int main() { cout << pow_2(20) << "/" << pow_2(19) << endl; }
题目解析
说实话,这道题真的挺难的,但难的却是思维,这道题又挺简单的,简单的是题目本身。
说了一通比较扯淡的话,博主也就只敢保证能解出来正确答案,要是找出一种错误的方法,这个难度就有点高了,从讨论区,博主也看到不少关于这道题的数学解法:等比数列公式。看到公式的时候,博主是有印象的,这题目大学时是学过的,还记得iOS中有一个数量的悖论:影响性能的永远不是黎平渲染的阴影圆角,而是数量。用到这里就是:你用不到的东西不代表没用。
题目留给大家,思路博主简单说下吧,这已经是第十二篇了,博主真不敢说对此类问题已经完全了解,说到底都是数学问题,有点心惊。
1.计算和
四个选项看的人有点懵,因为部分选项中没看到累加和的体现, 没错,你没看错,不用怀疑自己,确实没体现出累加和的运算,博主一开始也看的有些晕,这道题是昨天看的,晚上的时候又看了一遍才看明白,今天就现身说法。
这里的考点其实是最大公约数!!!
2.最大公约数
公式里体现的都是a,b两数作为分子分母的互斥的最小数,所以理所当然的要求出他们的最大公约数并分别除以这个最大公约数,有了这个理念,你再去看四个选项,问题就不大了。
求最大公约数,三段最好理解的代码:
片段1:
int gcd(int a, int b) { return a % b ? gcd(b, a % b) : b; }
片段2:
int gcd(int a, int b) { while (b > 0) { int c; c = a % b; a = b; b = c; } return a; }
片段3:
int gcd(long a, long b) { if (b == 0) return a; return gcd(b, a % b); }
总结
看完这道题目,感觉题目的意图不明显,并没有真正的去解题,可能是觉得题目本身不难,要考察的是求取最大公约数的方法,要说题目不难,剩下的,就留给大家去思考了吧,有问题,欢迎评论区留言讨论。