zoukankan      html  css  js  c++  java
  • 无聊地分析下某网站的注册验证码

       额,那个网站是pipi书屋,看别人介绍网站书挺多的,于是就进去看了一下,注册时看到了很有趣的验证码,都是给C语言程序让写出结果的,不由得让我想起以前微博上流行的复旦大学的微积分验证码。。。想法很新颖嘛,不愧是专门搞计算机类图书的网站。


       看了那注册程序发现挺有趣的,于是列出来看,说不定能学到很多东西。。。

    1

    #include <stdio.h>
    
    int main()
    {
        int a = 1;
        printf("%d", a << 2 + a);
        return 0;
    }
    

    <<这个操作符挺少见的,和>>一样都是移位操作符,就是二进制移位,关于移位我转了个文章,点击此处

    题目不难,1的二进制就是00000001,然后左移2位就是00000100,也就是十进制的8了。(让我想起字符表情←_←和→_→)

    话说<<和>>在C++是输出输入符呢。。。


    2

    #include <stdio.h>
    main()
    {
        printf("%s:%c%d", "pipi", 41, 81);
    }


    这题考的格式控制符,%s %c %d 分别是字符串,字符和有符号十进制数,41是ASCII码,转换后的字符是),所以最后输出的值是 pipi:)81 ,顺便转载了个关于转义符和格式控制符的文章,点击此处

    (貌似那个81是随机产生的。。。)



    3

    #include <stdio.h>
    
    int main()
    {
        int i=43;
        printf("%d\n",printf("%d",printf("%d",i)));
        return 0;
    }


    嗯,这是关于printf返回值的题目,printf返回的是输出的字符数,转义字符算一个字符。这样就题目很容易理解了,答案是4321。


    4

    #include <stdio.h>
    #define ARRAY_SIZE 10
    int main() 
    {
        int arr[ARRAY_SIZE] = {51,116,53,120,85,66,71,98,86,100};
        int i, j;
        for(i = 0; i < ARRAY_SIZE; i++)
            for(j = 0; j < ARRAY_SIZE-1; j++)
                if(arr[j] > arr[j+1]) {
                    arr[j] ^= arr[j+1];
                    arr[j+1] ^= arr[j];
                    arr[j] ^= arr[j+1];
                }
        for(i = 0; i < ARRAY_SIZE; i++)
            printf("%c", arr[i],arr[i]);
    }


    作为验证码,这题还真难一眼看出来。。。

    好吧是我太弱看不出来,^=这个符号好少见,我查了半天,为什么书里面都没有讲到异或运算符^。。。

    a^b,以二进制一位一位对着看,如果相同就取0,如果不同就取a的反(大概是这样),然后再换成十进制,而且

    a=a^b;b=b^a;a=a^b;

    这句能交换两值,不使用临时变量,灰常神奇。

    总之这题就是简单的排序而已,从小到大排序再输出对应的字符:35BGUVbdtx。


    5

    #include <stdio.h>
    
    int n[]={0x48,                                                                                                               0x65,0x6C,0x6C, 
    0x6F,0x2C,0x20, 
    0x77,0x6F,0x72, 
    0x6C,0x64,0x21, 
    0x0A,0x00},*m=n;
    main(n){ 
        if(putchar (*m)!='\0') main(m++);
    }

    好吧,递归用在main函数上可以吗,反正我的VC是出错了。。。

    题目意思很容易懂,就是输出那些十六进制对应的字符。把n改成int *n调试成功,答案为:Hello, world!



    6

    #include <stdio.h>
    
    int main() {
        int x;
    	printf("%d",x == (1 && x));
    }


    这个很容易理解,但这有些问题。

    先计算1 && x,当x为1时返回值为1,然后输出1,如果x为其他数返回值也为1,最后输出为0。

    而x为多少得看编译器把未初始化的x定义为多少,不同编译器不同结果。

    但正常编译器都不会定义为1的,所以答案为0。



    7

    #!/usr/bin/env python
    import math
    print int(math.pow(2, 69))


    python语言我也没学过啊,上传到http://codepad.org/上跑了一下就出来了,据百度知道上说是求2的69次方。。。

    答案为:590295810358705651712



    8

    // javascript
    
    function show(a){
    	alert(2 < a < 3);
    }
    
    show(1);


    javascript。。。还是没学过,有空得学学。。。

    度娘说

    1. 首先计算2<1,结果为false,
    2. 然后计算 false<3;
    3. js自动转换数据类型以做比较,false就是0
    4. 0<3的结果自然是true

    答案为true



    嗯,题目就差不多了,如果以后再刷新出新题目再拿来分享吧。。。

    这次也学到了挺多(^_^)(这不是异或号哦)。。。

  • 相关阅读:
    2015年要做的150件事
    再见2014,你好2015
    页面滚动事件的使用
    简单的进度条演示
    mybatis foreach批量处理
    mysql执行顺序
    spring声明式事务 同一类内方法调用事务失效
    Semaphore
    springmvc使用JSR-303对复杂对象进行校验
    springmvc全局异常后返回JSON异常数据
  • 原文地址:https://www.cnblogs.com/java20130723/p/3212205.html
Copyright © 2011-2022 走看看