求数字奇偶特征值

对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。按照二进制位值将1的位的位值加起来就得到了结果13。

你的程序要读入一个非负整数,整数的范围是[0,100000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。

提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。

输入格式:
一个非负整数,整数的范围是[0,100000]。
输出格式:一个整数,表示计算结果。
输入样例:342315
输出样例:13
时间限制:500ms内存限制:32000kb

/*我原来对于此题的思路是整个化为个位整数求二进制值,后来发现过于复杂。
最后是按照奇数+奇数则为偶数,奇数+偶数则为奇数的思路来解决。*/
#include<stdio.h>
int main(){
    int i=1,j=1,x,value=0;  
    scanf("%d",&x);
    while(x!=0){
        if((x+i)%2==0)
        {
            value = value + j;
        }
        i++;
        x = x/10;
        j = j*2;    
    }
    printf("%d", value);
    return 0;
}

多个整数排序

啊哈C语言!逻辑的挑战

P159.输入n个数,并将这n个数按照从小到大的顺序输出。

#include<stdio.h>
#include<stdlib.h>
int main(){
    //命名变量 
    int i,j,t,n;
    //输入比较数字的个数 
    scanf("%d",&n);
    //设定需要多少个数组 
    int a[n];
    //输入用于比较的数字 
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    //比较数字 
    for(i=0;i<n-1;i++){
        for(j=i+1;j<n;j++){
            if(a[i]>a[j]){
                t = a[i];a[i]=a[j];a[j]=t;
            }
        }
    }
    //输出从小到大的n位数数字 
    for(i=0;i<n;i++){
        printf("%d ",a[i]);
    }
    return 0;
} 

tips:
真讨厌这本书的作者的代码风格,单行的for循环不写{}直接用tab代替。

使用C生成随机数

啊哈C语言!逻辑的挑战

P142.如何随机生成一个1~20 000 000的随机数

#include<stdio.h>
#include<time.h>
int main(){
    int a,b,c;
    srand((unsigned)time(NULL));
    a = rand()/10;
    b = rand()/10;
    c = a * b;
    printf("%d",c);
    return 0;
} 

使用time函数生成的随机数范围是1~32767,那么32767整除10,再平方的结果就是10 732 176,在题目要求范围之内。

走迷宫

通过键盘上的w,a,s,d四个键控制一个小球走出迷宫。

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>

int main(){
    //画出迷宫 
    char a[7][7]={
        "######",
        "#O #  ",
        "# ## #",
        "#  # #",
        "##   #",
        "######"
    }; 

    int i;
    //定义坐标位置
    //x,y是起点的坐标 
    int x=1,y=1;
    //p,q是出口的坐标 
    int p=1,q=5;
    //定义数组 
    char ch;
    //把迷宫输出 
    for(i=0;i<6;i++){
        puts(a[i]);
    }   
    //当走出迷宫游戏结束
    //当游标不在出口位置 
    while(x!=p || y!=q){
        //读取当前字符 
        ch = getch();

        //定义s键,向下 
        if(ch == 's'){
            if(a[x+1][y]!='#'){
                a[x][y]=' ';
                x++;
                a[x][y]='O';
            }
        }

        //定义w键,向上 
        if(ch =='w'){
            if(a[x-1][y]!='#'){
                a[x][y]=' ';
                x--;
                a[x][y]='O';
            }
        }

        //定义a键,向左       
        if(ch =='a'){
            if(a[x][y-1]!='#'){
                a[x][y]=' ';
                y--;
                a[x][y]='O';
            }
        }

        //定义d键,向右       
        if(ch =='d'){
            if(a[x][y+1]!='#'){
                a[x][y]=' ';
                y++;
                a[x][y]='O';
            }
        }

        //q清屏 
        system("cls");
        //打印O的位置 
        for(i=0;i<6;i++){
            puts(a[i]);
        }
    }
    //终了,清屏,输出结果    
    system("cls");
    printf("You WIN!");
    sleep(5000);

    return 0;
}