精华内容
下载资源
问答
  • 我花了一夜用数据结构给女朋友写个H5走迷宫游戏

    万次阅读 多人点赞 2019-09-10 23:27:18
    起因 又到深夜了,我按照以往在csdn和公众号着数据结构!...而我答道:能干事情多了,比如写个迷宫小游戏啥的! 当我码完字准备睡觉不好别睡觉! 分析 如果用数据结构与算法造出东西来呢? ...

    先看效果图(在线电脑尝试地址http://biggsai.com/maze.html):
    在这里插入图片描述

    起因

    在这里插入图片描述
    又到深夜了,我按照以往在公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满!
    在这里插入图片描述
    超越妹妹时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,有啥作用。而我答道:能干事情多了,比如写个小游戏啥的!
    在这里插入图片描述
    当我码完字准备睡觉时:写不好别睡觉!
    在这里插入图片描述

    分析

    如果用数据结构与算法造出东西来呢?

    • 什么东西简单容易呢?我百度一下,我靠,这个鸟游戏原来不好搞啊,得接触一堆不熟悉的东西,搞不来搞不来。

    有了(灵光一闪),写个猜数字游戏,问他加减乘除等于几。

    • 超越妹妹又不是小孩子,糊弄不过去。

    经过一番折腾,终于在半夜12点确定写迷宫小游戏了。大概弄清楚其中的几个步骤。

    大概是

    • 画线—>画迷宫(擦线)—>方块移动、移动约束(不出界不穿墙)—>完成游戏

    画线(棋盘)

    对于html+js(canvas)画的东西,之前学过javaswing应该有点映像。在html中有个canvas 的画布,可以在上面画一些东西和声明一些监听(键盘监听)。

    对于迷宫来说,那些线条是没有属性的,只有位置x,y,你操作这个画布时候,可能和我们习惯的面相对象思维不一样。所以,在你设计的线或者点的时候,记得那个点、线在什么位置,在后续划线还是擦线还是移动的时候根据这个位置进行操作。

     <!DOCTYPE html>
    <html>
      <head>
        <title>MyHtml.html</title>	
      </head> 
      <body>
      <canvas id="mycanvas" width="600px" height="600px"></canvas>
        
      </body>
      <script type="text/javascript">
    
    var aa=14;
        var chess = document.getElementById("mycanvas");
        var context = chess.getContext('2d');
    
        //  var context2 = chess.getContext('2d');
        //      context.strokeStyle = 'yellow';
        var tree = [];//存放是否联通
        var isling=[];//判断是否相连
        for(var i=0;i<aa;i++){
            tree[i]=[];
            for(var j=0;j<aa;j++){
                tree[i][j]=-1;//初始值为0
            }
        }  for(var i=0;i<aa*aa;i++){
            isling[i]=[];
            for(var j=0;j<aa*aa;j++){
                isling[i][j]=-1;//初始值为0
            }
        }
        
        function drawChessBoard(){//绘画
            for(var i=0;i<aa+1;i++){
                context.strokeStyle='gray';//可选区域
                context.moveTo(15+i*30,15);//垂直方向画15根线,相距30px;
                context.lineTo(15+i*30,15+30*aa);
                context.stroke();
                context.moveTo(15,15+i*30);//水平方向画15根线,相距30px;棋盘为14*14;
                context.lineTo(15+30*aa,15+i*30);
                context.stroke();
            }
        }
        drawChessBoard();//绘制棋盘
       
        //      var mymap=new Array(36);
        //      for(var i=0;i<36;i++)
        //     {mymap[i]=-1;}
    
    
      </script>
    </html>
    

    实现效果
    在这里插入图片描述

    画迷宫

    随机迷宫怎么生成?怎么搞?一脸懵逼。

    • 因为我们想要迷宫,那么就需要这个迷宫出口和入口有连通路径,你可能压根不知道迷宫改怎么生成,用的什么算法。小声BB:并查集(不相交集合)

    迷宫和不相交集合有什么联系呢?(规则)

    • 之前笔者在前面数据结构与算法系列中曾经介绍过并查集(不相交集合),它的主要功能是森林的合并,不联通的通过并查集能够快速将两个森林合并,并且能够快速查询两个节点是否在同一个森林中!

    我们的随机迷宫:在每个方格都不联通的情况下,是一个棋盘方格,这也是它的初始状态。而这个节点可以跟邻居可能相连,也可能不相连。我们可以通过并查集实现。

    具体思路为:(主要理解并查集)

    • 1:定义好不想交集合的基本类和方法(search,union等)
      2:数组初始化,每一个数组元素都是一个集合,值为-1
      3:随机查找一个格子(一维数据要转换成二维,有点麻烦),在随机找一面墙(也就是找这个格子的上下左右),还要判断找的格子出没出界。
      具体在格子中找个随机数m——>随机数m在二维中的位置[m/长,m%长]——>这个二维的上下左右随机找一个位置p[m/长+1,m%长][m/长-1,m%长][m/长,m%长+1][m/长,m%长-1]——>判断是否越界
      4:判断两个格子(一维数组编号)是否在一个集合(并查集查找)。如果在,则重新找,如果不在,那么把墙挖去
      5:把墙挖去有点繁琐,需要考虑奇偶判断它那种墙(上下还是左右,还要考虑位置),然后擦掉。(根据数组转换成真实距离)。具体为找一个节点,根据位置关系找到一维数组的号位用并查集判断是否在一个集合中。
      6:最终得到一个完整的迷宫。直到第一个(1,1)和(n,n)联通停止。虽然采用随机数找墙,但是效果并不是特别差。其中要搞清一维二维数组的关系。一维是真实数据,并查集操作。二维是位置。要搞懂转化!

    注意:避免混淆,搞清数组的地址和逻辑矩阵位置。数组从0开始的,逻辑上你自己判断。别搞混淆!
    在这里插入图片描述
    主要逻辑为:

    while(search(0)!=search(aa*aa-1))//主要思路
        {
            var num = parseInt(Math.random() * aa*aa );//产生一个小于196的随机数
            var neihbour=getnei(num);
            if(search(num)==search(neihbour)){continue;}
            else//不在一个上
            {
               isling[num][neihbour]=1;isling[neihbour][num]=1;
                drawline(num,neihbour);//划线
                union(num,neihbour);
             
            }
        }
    

    那么在前面的代码为

    <!DOCTYPE html>
    <html>
      <head>
        <title>MyHtml.html</title>	
      </head> 
      <body>
      <canvas id="mycanvas" width="600px" height="600px"></canvas>
        
      </body>
      <script type="text/javascript">
    //自行添加上面代码
        //      var mymap=new Array(36);
        //      for(var i=0;i<36;i++)
        //     {mymap[i]=-1;}
        function getnei(a)//获得邻居号  random
        {
            var x=parseInt(a/aa);//要精确成整数
            var y=a%aa;
            var mynei=new Array();//储存邻居
            if(x-1>=0){mynei.push((x-1)*aa+y);}//上节点
            if(x+1<14){mynei.push((x+1)*aa+y);}//下节点
            if(y+1<14){mynei.push(x*aa+y+1);}//有节点
            if(y-1>=0){mynei.push(x*aa+y-1);}//下节点
            var ran=parseInt(Math.random() * mynei.length );
            return mynei[ran];
    
        }
        function search(a)//找到根节点
        {
            if(tree[parseInt(a/aa)][a%aa]>0)//说明是子节点
            {
                return search(tree[parseInt(a/aa)][a%aa]);//不能压缩路径路径压缩
            }
            else
                return a;
        }
        function value(a)//找到树的大小
        {
            if(tree[parseInt(a/aa)][a%aa]>0)//说明是子节点
            {
                return tree[parseInt(a/aa)][a%aa]=value(tree[parseInt(a/aa)][a%aa]);//不能路径压缩
            }
            else
                return -tree[parseInt(a/aa)][a%aa];
        }
        function union(a,b)//合并
        {
            var a1=search(a);//a根
            var b1=search(b);//b根
            if(a1==b1){}
            else
            {
                if(tree[parseInt(a1/aa)][a1%aa]<tree[parseInt(b1/aa)][b1%aa])//这个是负数(),为了简单减少计算,不在调用value函数
                {
                    tree[parseInt(a1/aa)][a1%aa]+=tree[parseInt(b1/aa)][b1%aa];//个数相加  注意是负数相加
                    tree[parseInt(b1/aa)][b1%aa]=a1;       //b树成为a树的子树,b的根b1直接指向a;
                }
                else
                {
                    tree[parseInt(b1/aa)][b1%aa]+=tree[parseInt(a1/aa)][a1%aa];
                    tree[parseInt(a1/aa)][a1%aa]=b1;//a所在树成为b所在树的子树
                }
            }
        }
    
        function drawline(a,b)//划线,要判断是上下还是左右
        {
    
            var x1=parseInt(a/aa);
            var y1=a%aa;
            var x2=parseInt(b/aa);
            var y2=b%aa;        
            var x3=(x1+x2)/2;
            var y3=(y1+y2)/2;
            if(x1-x2==1||x1-x2==-1)//左右方向的点  需要上下划线
            {
                //alert(x1);
                //  context.beginPath();
                context.strokeStyle = 'white';
                //    context.moveTo(30+x3*30,y3*30+15);//
                //   context.lineTo(30+x3*30,y3*30+45);
                context.clearRect(29+x3*30, y3*30+16,2,28);
                //    context.stroke();
            }
            else
            {
                //   context.beginPath();
                context.strokeStyle = 'white';
                //  context.moveTo(x3*30+15,30+y3*30);//
                //    context.lineTo(45+x3*30,30+y3*30);
                context.clearRect(x3*30+16, 29+y3*30,28,2);
                //      context.stroke();
            }
        }
         
        while(search(0)!=search(aa*aa-1))//主要思路
        {
            var num = parseInt(Math.random() * aa*aa );//产生一个小于196的随机数
            var neihbour=getnei(num);
            if(search(num)==search(neihbour)){continue;}
            else//不在一个上
            {
               isling[num][neihbour]=1;isling[neihbour][num]=1;
                drawline(num,neihbour);//划线
                union(num,neihbour);
             
            }
        }
      </script>
    </html>
    

    实现效果:
    在这里插入图片描述
    在这里插入图片描述

    方块移动

    这部分我采用的方法不是动态真的移动,而是一格一格的跳跃。也就是当走到下一个格子将当前格子的方块擦掉,在移动的那个格子中再画一个方块。选择方块是因为方块更方便擦除,可以根据像素大小精准擦除。

    另外,再移动中要注意不能穿墙、越界。那么怎么判断呢?很好办,我们再前面会判断两个格子是否联通,如果不连通我们将把这个墙拆开。再拆的时候把这个墙的时候记录这两点拆墙可走即可(数组)

    另外,事件的监听上下左右查一查就可以得到,添加按钮对一些事件监听,这些不是最主要的。

    为了丰富游戏可玩性,将方法封装,可以设置关卡(只需改变迷宫大小)。这样就可以实现通关了。另外,如果写成动态存库那就更好了。
    在这里插入图片描述

    结语

    在线尝试地址,代码直接查看网页源代码即可!

    笔者前端能力和算法能力有限,写的可能不是特别好,还请见谅!当然,笔者欢迎和一起热爱学习的人共同进步、学习!欢迎关注笔者公众号:bigsai,后台回复java、数据结构、爬虫、springboot等有精心准备资料一份。如果感觉不错,欢迎关注、点赞!蟹蟹!

    在这里插入图片描述

    展开全文
  • 优秀程序员不得知道的20个位运算技巧

    万次阅读 多人点赞 2012-12-08 09:45:47
    适当的运用运算总是一种迷人的手段,或者当您求职的时候,在代码中写入适当的运算也会让您的程序增加一丝亮点,最初当我读《编程之美》求“1的数目”,我才开始觉得运算是如此之美,后来读到 《Hacker's ...

    一提起位运算,人们往往想到它的高效性,无论是嵌入式编程还是优化系统的核心代码,适当的运用位运算总是一种迷人的手段,或者当您求职的时候,在代码中写入适当的位运算也会让您的程序增加一丝亮点,最初当我读《编程之美》求“1的数目”时,我才开始觉得位运算是如此之美,后来读到 《Hacker's Delight》,感慨到Henry S.Warren把位运算运用的如此神出鬼没,很多程序都十分精妙,我觉得在一个普通的程序中大量运用这样的代码的人简直是疯了!但掌握简单的位运算技巧还是必要的,所以今天写这篇博文把我积累的一些位运算技巧分享给大家,这些技巧不会是如求“1的数目”的技巧,是最基本的一行位运算技巧


    Welcome To My BitTricks

    1.获得int型最大值

    int getMaxInt(){
            return (1 << 31) - 1;//2147483647, 由于优先级关系,括号不可省略
    }

    另一种写法

    int getMaxInt(){
    	return ~(1 << 31);//2147483647
    }

    另一种写法

    int getMaxInt(){//有些编译器不适用
    	return (1 << -1) - 1;//2147483647
    }

    C语言中不知道int占几个字节时候

    int getMaxInt(){
    	return ((unsigned int) - 1) >> 1;//2147483647
    }

    2.获得int型最小值

    int getMinInt(){
    	return 1 << 31;//-2147483648
     }

    另一种写法

    int getMinInt(){//有些编译器不适用
    	return 1 << -1;//-2147483648
    }

    3.获得long类型的最大值


    C语言版

    long getMaxLong(){
    	return ((unsigned long) - 1) >> 1;//2147483647
    }

    JAVA版

    long getMaxLong(){
    	return ((long)1 << 127) - 1;//9223372036854775807
    }
    获得long最小值,和其他类型的最大值,最小值同理.

    4.乘以2运算

    int mulTwo(int n){//计算n*2 
    	return n << 1;
    }

    5.除以2运算

    int divTwo(int n){//负奇数的运算不可用
    	return n >> 1;//除以2
    }

    6.乘以2的m次方

    int mulTwoPower(int n,int m){//计算n*(2^m)
    	return n << m;
    }

    7.除以2的m次方

    int divTwoPower(int n,int m){//计算n/(2^m)
    	return n >> m;
    }

    8.判断一个数的奇偶性

    boolean isOddNumber(int n){
    	return (n & 1) == 1;
    }

    9.不用临时变量交换两个数(面试常考)


    C语言

    void swap(int *a,int *b){	
    	(*a) ^= (*b) ^= (*a) ^= (*b);	
    }

    通用版(一些语言中得分开写)

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

    10.取绝对值(某些机器上效率比n>0  ?  n:-n 高)

    int abs(int n){
    return (n ^ (n >> 31)) - (n >> 31);
    /* n>>31 取得n的符号,若n为正数,n>>31等于0,若n为负数,n>>31等于-1
    若n为正数 n^0=0,数不变,若n为负数有n^-1 需要计算n和-1的补码,然后进行异或运算,
    结果n变号并且为n的绝对值减1,再减去-1就是绝对值 */
    }
    

    11.取两个数的最大值(某些机器上,效率比a>b ? a:b高)


    通用版

    int max(int a,int b){
    	return b & ((a-b) >> 31) | a & (~(a-b) >> 31);
    	/*如果a>=b,(a-b)>>31为0,否则为-1*/
    }

    C语言版

    int max(int x,int y){
    	return x ^ ((x ^ y) & -(x < y));
    	/*如果x<y x<y返回1,否则返回0,
    、 与0做与运算结果为0,与-1做与运算结果不变*/
    }

    12.取两个数的最小值(某些机器上,效率比a>b ? b:a高)


    通用版

    int min(int a,int b){
    	return a & ((a-b) >> 31) | b & (~(a-b) >> 31);
    	/*如果a>=b,(a-b)>>31为0,否则为-1*/
    }

    C语言版

    int min(int x,int y){
    	return y ^ ((x ^ y) & -(x < y));
             /*如果x<y x<y返回1,否则返回0,
                与0做与运算结果为0,与-1做与运算结果不变*/
    }

    13.判断符号是否相同

    boolean isSameSign(int x, int y){ //有0的情况例外
    	return (x ^ y) >= 0; // true 表示 x和y有相同的符号, false表示x,y有相反的符号。
    }

    14.计算2的n次方

    int getFactorialofTwo(int n){//n > 0
    	return 2 << (n-1);//2的n次方
    }

    15.判断一个数是不是2的幂

    boolean isFactorialofTwo(int n){
    	return n > 0 ? (n & (n - 1)) == 0 : false;
    	/*如果是2的幂,n一定是100... n-1就是1111....
    	   所以做与运算结果为0*/
    }

    16.对2的n次方取余

    int quyu(int m,int n){//n为2的次方
    	return m & (n - 1);
    	/*如果是2的幂,n一定是100... n-1就是1111....
    	 所以做与运算结果保留m在n范围的非0的位*/
    }

    17.求两个整数的平均值

    int getAverage(int x, int y){
            return (x + y) >> 1; 
    }
    

    另一种写法

    int getAverage(int x, int y){
            return ((x ^ y) >> 1) + (x & y); 
         /*(x^y) >> 1得到x,y其中一个为1的位并除以2,
           x&y得到x,y都为1的部分,加一起就是平均数了*/
    
    } 

    下面是三个最基本对二进制位的操作

    18.从低位到高位,取n的第m位

    int getBit(int n, int m){
    	return (n >> (m-1)) & 1;
    }

    19.从低位到高位.将n的第m位置1

    int setBitToOne(int n, int m){
    	return n | (1 << (m-1));
    	/*将1左移m-1位找到第m位,得到000...1...000
    	  n在和这个数做或运算*/
    }

    20.从低位到高位,将n的第m位置0

    int setBitToZero(int n, int m){
    	return n & ~(1 << (m-1));
    	/* 将1左移m-1位找到第m位,取反后变成111...0...1111
    	   n再和这个数做与运算*/
    }


    另附一些对程序效率上没有实质提高的位运算技巧,一些也是位运算的常识(面试也许会遇到)

    计算n+1

    -~n

    计算n-1

    ~-n

    取相反数

    ~n + 1;
    

    另一种写法

    (n ^ -1) + 1;

    if(x == a) x = b; if(x == b) x = a;

    x = a ^ b ^ x;

    sign函数,参数为n,当n>0时候返回1,n<0时返回-1,n=0时返回0

    return !!n - (((unsigned)n >> 31) << 1); 
    


    如果您知道实用的一行位运算技巧请留言,博主不胜感激,还有我总结的位运算难免有不健壮之处,请您多多批评

    ==================================================================================================

      作者:nash_  欢迎转载,与人分享是进步的源泉!

      转载请保留原文地址http://blog.csdn.net/nash_/article/details/8262185

    ===================================================================================================

    展开全文
  • int为什么占4字节?一字节为什么是8

    千次阅读 热门讨论 2019-11-04 16:17:06
    知道大家有没有思考过这样的问题,一字节为什么是8呀,也许还有小伙伴知道我说的这些是什么,没关系往下看。 第一解释(历史)是IBM为System/360设计了一套8EBCDIC编码,涵盖了数字、大小字母和大部分...

    不知道大家有没有思考过这样的问题,一个字节为什么是8位呀,也许还有小伙伴不知道我说的这些是什么,没关系往下看。

    第一个解释(历史)是IBM为System/360设计了一套8位EBCDIC编码,涵盖了数字、大小写字母和大部分常用符号,同时又兼容广泛用于打孔卡的6位BCDIC编码。

    第二个解释,二进制我们应该都知道,在ASCII表中,存储的所有字符,用的是8位的二进制,0到127是,128个字符。最后个是01111111是删除键。如果在多加一个就不是8位了。

    以上我把一个字节为什么是8位解决了。

    下面说一下,为什么int是占4个字节

    第一个解释是int据说是根据不同的编译器在定义的,不同的编译器int的字节是不一样的,但是大多的编译器int都占4个字节。

    第二个解释是操作系统16位的时候,int 2字节,操作系统32位的时候,int 4字节,由于32位系统之前占主流地位,实际现在就算是64位系统,出于兼容性考虑,int也是4字节的。

    数据类型占内存的位数实际上与操作系统的位数和编译器(不同编译器支持的位数可能有所不同)都有关。

    展开全文
  • 2.7 线圈寄存器 0FH 1) 说明 线圈寄存器。若数据区的某值为“1”表示被请求的相应线圈状态为ON,若某值为“0”,则为状态为OFF。 2) 查询 从机地址为11H,线圈寄存器的起始地址为0013H,线圈...

    2.7 写多个线圈寄存器 0FH

    1) 说明

    写多个线圈寄存器。若数据区的某位值为“1”表示被请求的相应线圈状态为ON,若某位值为“0”,则为状态为OFF。

    2) 查询

    从机地址为11H,线圈寄存器的起始地址为0013H,线圈寄存器的结束地址为001CH。总共访问10个寄存器。寄存器内容如下表所示。

    表2.7.1 线圈寄存器0013H到001CH

    001AH

    0019H

    0018H

    0017H

    0016H

    0015H

    0014H

    0013H

    1

    1

    0

    0

    1

    1

    0

    1

    0022H

    0021H

    0020H

    001FH

    001EH

    001DH

    001CH

    001BH

    0

    0

    0

    0

    0

    0

    0

    1

    传输的第一个字节 CDH 对应线圈为0013H到001AH,LSB(最低位)对应线圈0013H,传输第二个字节为 01H,对应的线圈为001BH到001CH,LSB 对应线圈001CH,其余未使用位使用0 填充。

    表2.7.1 写多个线圈寄存器——查询

     

    Hex

    从机地址

    11

    功能码

    0F

    寄存器地址高字节

    00

    寄存器地址低字节

    13

    寄存器数量高字节

    00

    寄存器数量低字节

    0A

    字节数

    02

    数据1(0013H-001AH)

    CD

    数据2(001BH-001CH)

    01

    CRC校验高字节

    BF

    CRC校验低字节

    0B

     


     

    3) 响应

    表2.7.1 写多个线圈寄存器——响应

     

    Hex

    从机地址

    11

    功能码

    0F

    寄存器地址高字节

    00

    寄存器地址低字节

    13

    寄存器数量高字节

    00

    寄存器数量低字节

    0A

    字节数

    02

    CRC校验高字节

    99

    CRC校验低字节

    1B

     


     

    2.8 写多个保持寄存器10H

    1) 说明

    写多个保持寄存器。

    2) 查询

    从机地址为11H。保持寄存器的其实地址为0001H,寄存器的结束地址为0002H。总共访问2个寄存器。保持寄存器0001H的内容为000AH,保持寄存器0002H的内容为0102H。

    表2.8.1 写多个保持寄存器——请求

     

    Hex

    从机地址

    11

    功能码

    10

    寄存器起始地址高字节

    00

    寄存器起始地址低字节

    01

    寄存器数量高字节

    00

    寄存器数量低字节

    02

    字节数

    04

    数据1高字节

    00

    数据1低字节

    0A

    数据2高字节

    01

    数据2低字节

    02

    CRC校验高字节

    C6

    CRC校验低字节

    F0

    表2.8.2 保持寄存器0001H到0002H内容

    地址

    0001H高字节

    0001H低字节

    0002H高字节

    0003H低字节

    数值

    00

    0A

    01

    12


     

    3) 响应

    表2.8.3 写多个保持寄存器——响应

     

    Hex

    从机地址

    11

    功能码

    10

    寄存器起始地址高字节

    00

    寄存器起始地址低字节

    01

    寄存器数量高字节

    00

    寄存器数量低字节

    02

    CRC校验高字节

    12

    CRC校验低字节

    98

    展开全文
  • import java.util.Random; public class Test {  public static void main(String[] args) {  Random r=new Random();  int tag[]={0,0,0,0,0,0,0,0,0,0};
  • 只有对应的两二进位均为1,结果才为1 ,否则为0。参与运算的数以补码方式出现。 例如:9&amp;5可算式如下: 00001001 (9的二进制补码)&amp;00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9...
  • sqlserver位数不够左边补0

    万次阅读 2018-08-07 20:46:28
    有的时候需要循环存放一从1开始的字符串 、位数还有要求,我第一次在的时候想着在左边拼接几个0不就行了,完我发现超过10不行了,位数超了 这时候需要用到左补0方法 下面我给大家一示例:   ...
  • 测试是一3的正整数。 输出格式: 输出按逆序的数。 输入样例: 123 输出样例: 321 # include <stdio.h> int main(void) { int input, output, i; int a[3]={0}; scanf("%d", &...
  • /*8.8 函数,输入一4数字, 要求输出这4数字字符, 但每两数字间有一空格。 如输入1990,应输出“1 9 9 0”。 */ #include void AddBlank(char s[]) { char sNew[7]; int i,j,flag=2; for(i=0,j=...
  • 一函数,输入一数字,要求输出这四数字字符,但每两数字间空格。如输入1990,应输出"1 9 9 0"。 输入 一四位数 输出 增加空格输出 样例输入 1990 样例输出 1 9...
  • C程序设计(第四版) 谭浩强 习题7.8 个人设计习题 7.8 函数,输入一4数字,要求输出这4数字字符,但每两数字间空一空格。如输入1990,应输出“1 9 9 0”。代码块:#include <stdio.h>char addsp...
  • 在实际编程过程中,我们常常要遇到这种情况:有一对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一和A完全相同新对象B,并且此后对B任何改动不会影响到A中的值,也就是说,A与B是两独立的对象,...
  • 运算与字母大小转换

    千次阅读 2016-04-21 09:01:21
     在读王爽老师的《汇编语言》,看到了用and 和or指令处理字母大小转换的例子。and 和or是汇编语言中按与和按或操作的指令,对应C语言中的&和|操作。本文把这例子的C语言版在这里重复一下,以便理解和扩充...
  • num=input('你好呀,请输入一个不多于五的正整数>>>') print('嗯,我看过了,这是一'+str(len(num))+'位数。') #len函数可以查看字符串的长度,也就是能得出这是一数,用str转换成字符串之后才能...
  • C语言求个位数十位数

    千次阅读 2012-12-11 10:48:03
    关于求两数中位数和十数的DEMO 练习基本知识 #include void end_ten_bit_result(int src); int main(void) { int src; printf("请输入一数:\n"); do { scanf("%d",&src); if ((src=100)) ...
  • 合并的方式是:将a数的十位和个位依次放在c数的十位和千位,b数的十位和个位依次放在c数的百位和各位。 例如,当a=45,b=12,调用该函数后,c=5142我的代码如下(C语言):#include int main() { int fun(int...
  • 因为C标准规定的是double...编译器是默认输出浮点数小数点后6,这两个不冲突。 当然如果你需要显示小数点后更多数字,可以这么printf("%.nf",a);n是多少输出几小数 输出float类型数值同理。 ...
  • 在线生成32和16大小MD5密文

    千次阅读 2017-06-17 00:01:53
    MD5是一种可逆的加密算法,码工具的在线MD5加密为我们提供32,16等MD5加密,可以在线生成32和16的大写和小写的密文。
  • 先来简单的讲下什么是大小端模式,以及两模式的区别:所谓大小端模式就是存储数据,数据的高低怎么存储在地址的高低位上。(指的是bit,一char类型数据有8) 大端模式:数据的高位,存放在地址的低位。...
  • 【技巧总结】运算装逼指南

    万次阅读 多人点赞 2019-11-18 13:34:09
    算法的效率有多快我就不说,信你可以去用 10 亿数据模拟一下,今天给大家讲一讲运算的一些经典例子。不过,最重要的不是看懂了这些例子好,而是要在以后多去运用运算这些技巧,当然,采用运算,也是...
  • 窗宽窗到底是什么

    万次阅读 2020-02-27 16:29:08
    1. 为什么有窗宽窗? 医学图像领域的关键技术窗技术,是CT检查中用以观察不同密度的正常组织或病变的一种显示技术,包括窗宽(window width)和窗(window level)。由于各种组织结构或病变具有不同的CT值,因此想...
  • 生成1亿个不重复的8随机整数

    万次阅读 2013-10-12 15:46:46
    项目中有一部分需要用到8位不重复的随机整数,即有1到99999999种可能,即1亿可能。这可是一个不小的数据量。那要怎么去实现呢? 1、尝试使用Access 在看到这需求,第一反应就是使用数据库。但是客户又要求...
  • 帅地:用心好每一篇文章! 前言 天各一方的两台计算机是如何通信的呢?在成千上万的计算机中,为什么一台计算机能够准确着寻找到另外一台计算机,并且把数据发送给它呢? 可能很多人听说过网络通信的 5 层模型...
  • CODE SEGMENT ASSUME CS:CODE START: mov bx,0 mov ch,4 ...键盘输入416进制数 int 21h cmp al,39h ;判断是0~9还是A~H,若是数字减30H,否则还要减07H jbe next sub al,07h next: sub al,30h shl bx...
  • 问题是我们在Quora闲逛偶然遇到的,觉得非常有意思,分享给大家。尽管Windows有很多完美的地方,但是它依旧是世界使用人数最多(超过80%),最稳定的操作...
  • 问题描述  输入两个整数a和b,输出这... 定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。  计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把
  • #include <Servo.h> Servo myservo1; Servo myservo2; int val1; int val2; void setup() { myservo1.attach(8);... val1=map(val1,0,1023,0,180); myservo1.write(val1); delay(5); } delay(5); }
  • 一、需求:密码必须是包含大写字母、小写字母、数字、特殊符号(不是字母,数字,下划线,汉字的字符)的8以上组合 二、方案:利用正则表达式来校验 三、思路:排除法  1、排除大写字母、小写字母、数字、特殊...
  • #e6.1随机密码生成,在26字母大小和9数字组成的列表中随机生成108密码 import random s = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,285,735
精华内容 514,294
关键字:

个位上是0的时就什么都不写