无聊地分析下某网站的注册验证码

   额,那个网站是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



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

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

原文地址:https://www.cnblogs.com/java20130723/p/3212205.html