关于 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;
}
problem5.cpp

相关文章: