关于 caesum.com 网上上的题目,分类有Sokoban,Ciphers,Maths,Executables,Programming,Steganography,Misc。题目有点难度,在努力奋战中……
problem 21 Factor
数806515533049393最大的质因数是多少?
因数分解题,32位int范围在四十亿左右。我是这么记这个大概值的,全球六十多亿人口,很多人还不能上网,而且有局域网的存在,IP本来够用的,因为北美划用了很多,导致了现在的IP不够用,出现了IPv6。64位的int放得下,可以使用 int64_t 存储。算法嘛,平方筛就可以。
我就不再手写了,直接用linux的命令 factor 得到答案。
martin@M2037:~$ factor 120
120: 2 2 2 3 5
problem 4 In days of Olde
提到了Caesar加密,类似汇编的ROL/ROR指令,加密的时候,字符串循环移动。给了一串字符dvoowlmvgsvdliwblfhvvprhzgyzhs,说用的不是Caesar加密,而是一种更古老的方法。
这难道是要让我翻阅历史,追溯比Caesar加密更古老的加密方法么?字符少,频率分析不靠谱。大概扫了一眼,看到了oo与vv,应该只是简单的字符替换。
推敲了几分钟后,发现用的也是线性变换。只不过从 y=a+x 变成 y=a-x 了。(mod 26)
problem 5 Pythagoras
毕达哥拉斯定理在中国称之为勾股定理。这让我想起了《三体》第一部里面把欧姆定律改成电阻定律、麦克斯韦方程改名成电磁方程的场景,说所有的科学成果都是广大劳动人民智慧的结晶,那些资产阶级学术权威不过是窃取了这些智慧。不过,话又说回来,勾股定理确实发现得较早些,只是没有交流传出到国外。
回到正题,像 (3, 4, 5) 和 (5, 12, 13) 这样的整数勾股数对还有很多,题目要求找出面积为 666666 的此类三角形,有公约数的不算,例如(6, 8, 10)。
#include <stdio.h> #include <math.h> // gcc problem5.cpp -o test -Wall -lstdc++ -lm int main() { const int AREA = 666666 * 2; // a*b int max = static_cast<int>(sqrt(AREA)); for(int a = 2; a < max; ++a) { if(AREA % a != 0) continue; int b = AREA / a; int cc = a*a + b*b; int c = static_cast<int>(sqrt(cc)); if(cc == c*c) printf("(%d, %d, %d)\n", a, b, c); } return 0; }