精华内容
下载资源
问答
  • 相反数问题

    千次阅读 2017-09-10 11:33:11
    /(ㄒoㄒ)/~~)一个整数1234与倒序数4321和称之为相反数。现在的问题要求是:从控制台输入一个整数n (1 ≤ n ≤ 10 ^ 5),输出相反数。如1234,就输出1234 + 4321 = 5555。#从容入坑既然待处理的值是一个整数,...

    #引子

    或许你已经知道了问题的描述,不过这里再重复一遍,因为很羞赧的说:“这个问题,我栽了个大跟头!”(尽情嘲笑我吧!/(ㄒoㄒ)/~~)

    一个整数1234与它倒序数4321和称之为相反数。现在的问题要求是:从控制台输入一个整数n (1 ≤ n ≤ 10 ^ 5),输出它的相反数。如1234,就输出1234 + 4321 = 5555。

    #从容入坑

    既然待处理的值是一个整数,一个简单的想法是把输入的数用一个long来存储(64位系统,int是4个字节,是可以代表以上整数范围的,但考虑到32位系统,就使用长整型吧。)。再用一个long来表达最终的结果值result,在输入n后就把它加入到result中。现在result与最后的正确结果就缺少它的倒序数了。

    因为我们不知道最终输入的n总共有几位,所以如果要取出n的每一位,就不得不让其依次除以100000、10000、1000、100、10。然后乘以最终的除数,并乘以分别的倍数1、10、100、1000、10000、100000。然后你就会发现,这个决定有一个Bug,如果不是6位的数字,在进行10000、100000的倍乘时,会出现问题。所以要让这个方法可行的话,还要判断当前输入数字的位数。但是问题的本身真的有这么复杂吗?

    #重回正轨

    重新审一下题,输入元是一个知道大小范围的整数,确切来说是知道位数的整数。这给我们透露了什么样的信息了?是的,使用字符串处理。因为从控制台输入的内容本质上都是字符串类型,然后在运行时,系统会自动匹配对应类型,比如将它作为int或者string存储。使用字符串带来的好处是问题的解决过程就是字符串的倒序和顺序的字符和,再将其转换成数字即可。一个简单的实现可以兑现为:

    #include <iostream>
    
    using namespace std;
    
    int main() {
        string str;
        int zeroASCII = '0';
    
        cin >> str;
    
        for (int i = 0; i < str.length(); i ++) {
            int noASCII = str[i];
            int reNoASCII = str[str.length() - 1 - i];
    
            int resultASCII = noASCII - zeroASCII + reNoASCII - zeroASCII;
    
            cout << resultASCII;
        }
    
        cout << endl;
    
        return 0;
    }

    #总结

    算法的实现过程其实很简单,就是利用字符的ASCII码的差值来实现字符的相加。在OC中我们有现成的API可以完成字符串转成int,而其实它的底层实现或许就是通过这样的一个方式来转换的。真是高级的API用多了,最基本的线性过程工作流竟都有点忘却了,这里记录一笔:好好自省。算法和数据结构方面需要恶补,这种小白菜级别的问题都掉入了坑里,真是让人觉得汗颜!

    面壁思过一百天中……

    #勘误

    上述例程没有考虑到进位问题,在牛客网上只能通过40%的测试用例,以下是它的修订版本:

    #include <iostream>
    #include <stack>
    
    using namespace std;
    
    int main() {
        string str;
    
        stack<int> result;
    
        int zeroASCII = '0';
        unsigned short int carryFlag = 0;
    
        cin >> str;
    
        for (int i = int(str.length() - 1); i >= 0; i --) {
            int noASCII = str[i];
            int reNoASCII = str[str.length() - 1 - i];
    
            int resultASCII = noASCII - zeroASCII + reNoASCII - zeroASCII + carryFlag;
    
            if (i == 0) {
                result.push(resultASCII);
            } else {
                carryFlag = resultASCII / 10;
    
                result.push(resultASCII % 10);
            }
        }
    
        int count = int(result.size());
        for (int i = 0; i < count; i ++) {
            cout << result.top();
    
            result.pop();
        }
    
        cout << endl;
    
        return 0;
    }
    
    展开全文
  • 证书与签名():数字签名是什么

    万次阅读 多人点赞 2017-04-21 18:47:26
      在签名的过程中,有一点很关键,收到数据的一方,需要自己保管好公钥,但是要知道每一个发送方都有一个公钥,那么接收数据的人需要保存非常多的公钥,根本就管理不过来。并且本地保存的公钥有可能被篡改替换,...

      文章由阮一峰翻译,作者为 David Youd。用图片通俗易懂地解释了,”数字签名”(digital signature)和”数字证书”(digital certificate)到底是什么。
      原文网址:http://www.youdzone.com/signature.html
      阮一峰:http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

    1.
      这里写图片描述

      鲍勃有两把钥匙,一把是公钥,另一把是私钥。

    2.
      这里写图片描述

      鲍勃把公钥送给他的朋友们—-帕蒂、道格、苏珊—-每人一把。

    3.
    这里写图片描述

      苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。

    4.
      这里写图片描述

      鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。

    5.
      这里写图片描述

      鲍勃给苏珊回信,决定采用”数字签名”。他写完后先用Hash函数,生成信件的摘要(digest)。

    6.
      这里写图片描述

      然后,鲍勃使用私钥,对这个摘要加密,生成”数字签名”(signature)。

    7.
      这里写图片描述

      鲍勃将这个签名,附在信件下面,一起发给苏珊。

    8.
      这里写图片描述

      苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。

    9.
      这里写图片描述

      苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。

    10.
      这里写图片描述

      复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成”数字签名”,写信给苏珊,让苏珊用假的鲍勃公钥进行解密。

    11.
      这里写图片描述

      后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找”证书中心”(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成”数字证书”(Digital Certificate)。

    12.
      这里写图片描述

      鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。

    13.
      这里写图片描述

      苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明”数字签名”是否真的是鲍勃签的。

    14.
      这里写图片描述

      下面,我们看一个应用”数字证书”的实例:https协议。这个协议主要用于网页加密。

    15.
      这里写图片描述

      首先,客户端向服务器发出加密请求。

    16.
      这里写图片描述

      服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。

    17.
      这里写图片描述

      客户端(浏览器)的”证书管理器”,有”受信任的根证书颁发机构”列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。

    18.
      这里写图片描述

      如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。

    19.
      这里写图片描述

      如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。

    20.
      这里写图片描述

      如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。



    总结:

    1.  密钥对,在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的。
    2.  公钥,公钥用来给数据加密,用公钥加密的数据只能使用私钥解密。
    3.  私钥,如上,用来解密公钥加密的数据。
    4.  摘要,对需要传输的文本,做一个HASH计算,一般采用SHA1,SHA2来获得。
    5.  签名,使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名。
    6.  签名验证,数据接收端,拿到传输文本,但是需要确认该文本是否就是发送发出的内容,中途是否曾经被篡改。因此拿自己持有的公钥对签名进行解密(密钥对中的一种密钥加密的数据必定能使用另一种密钥解密。),得到了文本的摘要,然后使用与发送方同样的HASH算法计算摘要值,再与解密得到的摘要做对比,发现二者完全一致,则说明文本没有被篡改过。
      上面实际上介绍了加密解密和数字签名两个概念和实现过程,二者的过程正好是相反的。
      在签名的过程中,有一点很关键,收到数据的一方,需要自己保管好公钥,但是要知道每一个发送方都有一个公钥,那么接收数据的人需要保存非常多的公钥,这根本就管理不过来。并且本地保存的公钥有可能被篡改替换,无从发现。怎么解决这一问题了?由一个统一的证书管理机构来管理所有需要发送数据方的公钥,对公钥进行认证和加密。这个机构也就是我们常说的CA。认证加密后的公钥,即是证书,又称为CA证书,证书中包含了很多信息,最重要的是申请者的公钥。
      CA机构在给公钥加密时,用的是一个统一的密钥对,在加密公钥时,用的是其中的私钥。这样,申请者拿到证书后,在发送数据时,用自己的私钥生成签名,将签名、证书和发送内容一起发给对方,对方拿到了证书后,需要对证书解密以获取到证书中的公钥,解密需要用到CA机构的”统一密钥对“中的公钥,这个公钥也就是我们常说的CA根证书,通常需要我们到证书颁发机构去下载并安装到相应的收取数据的客户端,如浏览器上面。这个公钥只需要安装一次。有了这个公钥之后,就可以解密证书,拿到发送方的公钥,然后解密发送方发过来的签名,获取摘要,重新计算摘要,作对比,以验证数据内容的完整性。
      这里纯粹的文字,未免枯燥,可以结合前面提到的文章链接中的图片一起理解,这些文字对图片的理解应该有一些帮助。HTTPS是综合用了加密解密和数字签名的实例,理解了上述概念和过程,结合密钥对交换的过程就不难理解HTTPS。

    展开全文
  • 这一篇文章要探讨的是“如何用算法实现十进制转十六进制”并不涉及什么特别的知识点。属于C语言基础篇。 在翻找素材的时候,发现篇以前写的挺有意思的代码,篇代码里面涉及的知识点没有什么好讲的,也没有什么...

    在这里插入图片描述
    这一篇文章要探讨的是“如何用算法实现十进制转十六进制”并不涉及什么特别的知识点。属于C语言基础篇

    在翻找素材的时候,发现一篇以前写的挺有意思的代码,这篇代码里面涉及的知识点没有什么好讲的,也没有什么特别的逻辑概念在里面,仅仅只是想要分享一下个人对于编程方面的一些思考和坚持而已。


    先看代码:

    #include <stdio.h>
    #include <string.h>
    int Judge(int n);
    int Detection(void);
    
    int main(void)
    {
    	char x[16] = {'0','1','2','3','4','5','6','7','8',
    			'9','a','b','c','d','e','f'};//十进制与十六进制对应的数组
    
    	printf("请输入一个十进制的数:");
    	int n = Detection();//输入数据检查再赋值
    	int k = Judge(n);//检测数组需要的长度
    	char y[k];//创建数组储存十六进制数
    	memset(y,'\0',sizeof(y));//清空数组
    
    	int i,j;
    	j = 0;
    	while( n >= 16 )//把转换好的十六进制数依次输入数组
    	{
    		i = (n % 16);//先是求余
    		y[j] = x[i];//把得到的余数转为十六进制数(例如“11”转“b”)
    		j++;//数组下标移位
    		n /= 16;//求商再赋值给它自己(方便下个循环再除)
    		if(n < 16)
    			y[j] = x[n];
    	}
    
    	//此时数组y内的十六进制数是倒过来储存的
    	
    	printf("你输入的数转换成十六进制为:0x");//先输出“0x”前缀
    	while(j >= 0)//把储存了十六进制数的数组倒着输出
    	{
    		if(j > 0)//判断是不是最后一个,是的话换行
    			printf("%c", y[j]);
    		else
    			printf("%c\n",y[j]);
    		j--;
    	}
    
    	return 0;
    }
    
    int Judge(int n)//这个函数的作用是用来判断需要定义的数组大小的
    {
    	int k = 1;
    	int m = n;
    	while(m > 16)//如果小于16,那么1位就行了
    	{
    		m /= 16;//如果大于16先除与16
    		k++;//加一位
    	}
    	return k;
    }
    
    int Detection(void)//这个是第一篇博客里面的那个代码的封装版,用来保证输入的数为合法
    {
    	int n;
    	while(1)
    	{
    		if(scanf("%d", &n) != 1 || getchar() != '\n')
    		{
    			printf("你输入的数据有误,请再输一遍:");
    			while(getchar() != '\n');
    		}else
    			break;
    	}
    	return n;
    }
    

    这篇代码所要实现的功能很简单,就是把十进制转换为十六进制输出,当然也是有前提的,就是不能用那些转换符(例如%x)或者用一些现有的函数,需要自己写一个算法来实现转换。至于这个算法也不难,无非就是了解一下在数学上面如何把十进制转为十六进制,然后把那个过程用代码来实现罢了,网上已经有很多说明了。十进制转其他进制最常用的办法就是不断对其要求的进制数求余,然后余数反转。

    大概类似于这个样子的过程(灵魂画师附体)
    在这里插入图片描述


    这个过程在算法上面具体体现为先获取用户的十进制输入,然后不断的对其与16进行求商求余,把得到的余数反转输出,即为所要求的十六进制数。在这个过程中,由于需要把余数反转输出,没法每求一个余数就输出一个。所以就需要一个数组来存储这些已经求得的余数,然后再反向输出。在这整个输出的过程中,所涉及算法的难度并不大。但如果仅仅只是这样的话,我也没有必要专门写一篇文章来分享这个代码了。
    在这里插入图片描述


    我在写这个代码的时候,遇到一个问题,是关于数组的。既然我在输出之前需要把余数用数组储存起来,那么我这个数组需要定义多大呢?由于用户的输入并不确定,所以最终所得到的十六进制数也不确定,这样也就没有办法事先知道我需要的数组大小。定义大了浪费空间,定义小了又不够放。当初在做这道题的时候,老师给我们的建议是定义个“char x[20]”就可以了。

    我当时的第一反应就是,老师这是在给我们降低难度啊,这么随便的吗?万一用户输入的数据转换为十六进制之后超过20位呢?且不说浪费不浪费空间的问题,你这明显就是存在着bug啊!怎么也得要给个1024吧,20哪里够了。不过后来想想,如今的操作系统也就64位,转换成十六进制的话,也就16个数就可以表示完了,连20都给多了,四舍五入刚好取整嘛。而且也没有bug的存在,也就浪费了4个字节的内存而已。要是我当时意识到这点,我可能就会直接“char x[16]”完事。也就没有后面的什么事了。

    不过在当时的我看了来,这简直就是一个要逼死强迫症的bug啊!我可以容许浪费空间,也可以容许效率低下,但是绝不能放任bug不管啊。所以,我那天苦思冥想,最终认识到,我需要的是一个可变数组。这个数组要能够实现我放多少东西进去它就能存多少东西,我拿多少东西出来它就能缩小多少。为了实现这个需求,我上网找了一下可变数组的实现方法。但是不外乎两种情况,一种是在说C语言中没有可变数组另一种就是在用代码实现可变数组。只可惜我当时的技术水平有限,实在是看不懂那些天书,而且那些大佬的代码一长,就不写注释的了,通篇博客就一整篇代码,一点介绍性的文字都没有,别说我当时没那个技术看不懂啊,我就是现在看的懂也没耐心看你这么一整篇没有注释的代码啊!简直神烦(这也是我想要写博客的一个原因)。


    所以我当时在这模凌两可的网络环境下面,我认为是有可变数组的,只是藏着某个函数库里面而已,只是属于深度C而已,只是我还没有学到而已,于是那一整个下午我就都在探索可变数组。

    直到后来我才知道,在C语言里面,本身就不存在什么可变数组,在C++中倒是存在可变数组的概念,网络上面的所谓可变数组,不过是利用了指针来存储好原数组的内存位置然后当再次需要改变数组大小的时候,在原位置上面创建或者把原数据拷贝到新的内存地址上面再返回新地址的值给原指针而已。说白了,就是假的,假的。根本就不存在什么可变数组。C语言本身就不支持可变数组这个功能。


    直到的最后,当然是没有成功啦,本来就是不存在的东西,不过现在想想用储存原数组地址这个方法来实现可变数组用在我这篇代码中或许也很合适,虽然我用的方法是在数据输入之后先判断一下需要的数组大小,然后再创建数组的方法。不过那也是我当时的权宜之计而已,
    在这里插入图片描述


    有意思的是当初我在不知道C语言中有没有可变数组的时候,曾想过用“指针对于非法内存的访问”来实现可变数组。具体表现可以看下面的代码

    int main(void)
    {
    	int i = 0;
    	char a[i];//根本没有分配空间,用“i”代替0是为了防止编译器报警告
    	char *c = a;//用一个指针来存储数组“a”的地址值
    	int j = 3;
    	a[j] = '7';//这里用“j”来代替3是为了防止编译器报警告
    
    	printf("%c ", c[3]);//这里用“c”来代替“a”输出也是为了防止编译器报警告
    	printf("\n");
    
    	return 0;
    }
    

    在这段代码里面数组“a”我根本没有分配空间给它,但是我却给它第3个位置“a[3]”赋值,居然编译通过了,运行也没有问题。这就是利用了指针对于非法内存的访问来实现的,而且这样也可以满足我的需求,我这个数组即没有大小限制的而且也丝毫不浪费内存,这不就是我想要的可变数组吗?

    但别以为这是什么好东西,恰恰相反在编程开发的时候,我们应该要去杜绝这种情况的发生。这段代码在不同的电脑下面或者在不同的程序区域下面运行都有可能不一样,你可以尝试把它封装成一个独立函数,然后试着在另外一篇小规模的代码上面调用试试看,可能在程序的开始调用它,程序就会报段错误,也有可能会在程序的尾部调用它,程序就报段错误了。也有可能整个程序执行完到退出,也没有报段错误。什么时候报段错误,完全取决于CPU在执行你这个程序的过程中什么时候访问到你正在使用的那块非法内存

    你的代码一运行就报错不可怕,最可怕的就是这种随机性报错的,你无法准确定位到你的错误位置。想象一下,你代码原本运行的好好的,你突然想给它来个优化,就好像把原本的int形数据改为char形的节省一下空间,或者改一下别的无关痛痒的细节,改完之后吧,你一编译运行,报错了,你就找啊找啊找啊,就是找不到在哪里有错误。
    然后你就很不甘心的把代码又改回去,但是你忽略了一个细节,你原本是先定义一个char类型的数据“a”然后再定义一个int类型的数据“b”的,但是你为了好看,你在优化的时候把它们改成了先定义“b”再定义“a”了。但是你在改回去的过程中觉得不可能是这里的问题啊,就没管了,结果编译运行后,还是报错。
    这时候你对着整篇代码从头看到尾,又从尾看到头,你看了好几遍,但就是不知道到底是哪里出了问题,明明跟原来的代码一摸一样啊,怎么就还是报错呢?这时候打死你也不会相信,就是因为你改变了那两个变量的定义顺序了,使得整个程序在内存中的储存结构发生了改变,这就造成了程序在运行的过程中访问到了原本不会访问的内存,而那块内存正是你用的非法内存。

    所以当时我在把这个思路运用到代码里面的时候,就出现了很多奇奇怪怪的问题,程序有时候行,有时候不行。有的时候甚至会出现同一个代码在我的电脑上面运行还可以一放到别人的电脑上面就有不行了这种情况,更夸张的是有时候上午运行可以,下午运行又报错了。搞了半天,放弃了。直到后来知道了野指针的概念之后,才渐渐知道为什么会出现那种情况。对于野指针的分析,以后有机会我可能还会单独写一篇文章来说明吧,也可能不会。虽然野指针还是挺重要的一个概念的,不过也挺简单,好像也没什么好写的。


    好了,就写到这里吧,确实没有什么知识点好说的,只是单纯的想要分享一下以前的一些有趣的事情而已。而且如果你刚好需要做一道编程题叫做”请用算法编程实现十进制数转XX进制数“的时候,这篇代码刚好可以套用嘛!不过不建议抄作业啦!参考参考就可以了,毕竟真没有什么难度的这题,注释代码里面都写明白了,应该也不会存在看不懂的现象,过些天我会尝试性的把这个例子改为用“储存原数组地址来实现可变数组”的方法来实现,然后再更新上来。

    最后附上这个例子的精简版代码:

    #include <stdio.h>
    #include <string.h>
    int Judge(int n);
    int Detection(void);
    
    int main(void)
    {
    	char x[16] = {'0','1','2','3','4','5','6','7','8',
    			'9','a','b','c','d','e','f'};//十进制与十六进制对应的数组
    
    	printf("请输入一个十进制的数:");
    	int n = Detection();//输入数据检查再赋值
    	int k = Judge(n);//检测数组需要的长度
    	char y[k];//创建数组储存十六进制数
    	memset(y,'\0',sizeof(y));//清空数组
    
    	int i,j;
    	for(j=0; n > 0; j++)//把转换好的十六进制数依次输入数组
    	{
    		i = (n % 16);
    		y[j] = x[i];
    		n /= 16;
    	}
    
    	printf("你输入的数转换成十六进制为:0x");
    	while(j >= 0)//把储存了十六进制数的数组倒着输出
    		printf("%c", y[--j]);
    	printf("\n");
    	return 0;
    }
    
    int Judge(int n)//这个函数的作用是用来判断需要定义的数组大小的
    {
    	int k;
    	for(k=0; n>0; ++k)
    		n /= 16;
    	return k;
    }
    
    int Detection(void)//这个是第一篇博客里面的那个代码的封装版,用来保证输入的数为合法
    {
    	int n;
    	while(1)
    	{
    		if(scanf("%d", &n) != 1 || getchar() != '\n')
    		{
    			printf("你输入的数据有误,请再输一遍:");
    			while(getchar() != '\n');
    		}else
    			break;
    	}
    	return n;
    }
    

    零BUG是原则性问题。

    展开全文
  • 向量和它本身 什么是点积? 两向量相乘,我们应该会想到如下场景: 但这个在现实生活中,用处不大。 但是其他乘法形式很有用。 最重要的是种向量运算方式是内积。也成为点积。 叫点积,是因为我们通常...

    目录

    什么是点积?

    点积运算

    向量与角的联系

    向量和它本身


    什么是点积?

    两个向量相乘,我们应该会想到如下场景:

    但这个在现实生活中,用处不大。 但是其他乘法形式很有用。

    最重要的是一种向量运算方式是内积。也成为点积

    点积,是因为我们通常表示为:在两个相乘的向量之间加个点。如图:

     从几何角度来看,这一运算很重要。使我们能够计算两个不同向量形成的角度。

    更加准确的说,在欧几里得空间里,向量v 和 w 的内积满足以下特征:

    (夹角是锐角,另外一边是钝角)

     

     请注意,两个向量的内积只是一个数字,不是向量。

    因此,我们可以使用余弦函数的对立函数即反余弦函数,我们可以算这个角,它等于反余弦v和w的点积 除以 v和w的大小点积:

    还可以理解为 反余弦v的标准化点积 w的标准化点积:

     

     

    点积运算

    好了,我们要采用更好的方式来计算内积(点积)。

    要计算v w ,我们可以将v 和 w的相应坐标相乘,然后相加:

    例如:

    那么结合之前学过的求角的等式,来看例子:

     

     

    向量与角的联系

    两个向量之间的点积和角之间的联系,会出现比较有趣的结果。

    我们来看看,如图:

    上图的x无论有多大,它小于等于1。

    根据之前的等式:

    我们知道:

    再把它精简为下图,这就是著名的不等式:柯西-许西尔兹不等式(Cauchy - Schwarz Inequality)

    你会发现线性代数和普通数学中经常出现这一不等式。

    假设 v 和 w 都不是零向量。如果为零向量,它们的点积会自动化为 0。

    1.

    如果下面等式成立:

     对之前的等式这意味着:

     所以,它们的方向指向同一方向:

    2.

    如果下面等式成立:

     对之前的等式这意味着:

    所以,v 和 w 是相反方向:

    3.

    如果  等于0 呢?

    那证明:

    所以, v 和 w 互为直角:

     

     

    向量和它本身

     向量与它本身的点积是多少呢?如图:

    这种情况下,两个相同的向量的角肯定是0度:

    cos0 = 1,所以:

    调整后:

     这样就多一个角度来看求向量的大小了。


    程序员的一生时间90%是用在编程上,而剩余的10%是活在世界上。

    展开全文
  • 在Java中,负数的绝对值竟然不一定是正数!!!

    千次阅读 多人点赞 2021-07-26 10:40:44
    绝对值是指一个数在数轴上所对应点到原点的距离,所以,在数学领域,正数的绝对值是这数本身,负数的绝对值应该是他的相反数。 这几乎是每个人都知道的。 在Java中,想要获得有个数字的绝对值,可以使用java.lang....
  • Vertx学习玩意是到底是

    万次阅读 2019-06-22 08:56:13
    Vertx,融合Java、Ruby、Python等语言的高性能架构,架构师必读 原文链接: ... ... 、Vert.x简介 二、Vert.x原理解析 三、Vert牛刀小试 四、Vert应用实践 五、辅助工...
  • Java快速交换两个数的值

    千次阅读 2012-06-27 12:22:36
    1:通过使用异或运算,可以快速将两个数的...如对两个数,经过三次进行异或运行后的结果是这个数的值互换。如 a = 0101, b=1101,则进行的操作如下:  第次异或运算: a = a ^b = 1000  第二次异或运算: b = a
  • 在扩容时,将其中一个dictht上的键值对rehash到另一个dictht上面,完成之后释放空间并交换两个dictht的角色。 typedef struct dict { dictType *type; void *privdata; dictht ht[2]; long rehashidx; /* rehashing ...
  • 出现次的数字(找单身狗)

    千次阅读 2020-12-10 17:00:21
    这里我们首先了解二进制位异或的一些性质 1.相同数字异或为0.(0 ^ 0 = 0, 1 ^ 1 = 0) 2.相反数字异或为1.(1 ^ 0 = 1) 3.和 0 异或结果不变( 1 ^ 0 = 1 , 0 ^ 0 = 0) 4.和 1 异或结果相反( 1 ^ 1 = 0, 0 ^ ...
  • Redis是款基于键值对的NoSQL数据库,的值支持多种数据结构: 字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。 • Redis将所有的数据都存放在内存中,所以的读写性能十分...
  • java中的位运算符有:左移(>)、无...java中使用补码来表示二进制,在补码表示中,最高位是符号位:0-正数,1-负数,补码规则为:正数最高位是0,其余的各位表示其数值本身;负数是该数值的绝对值的补码安慰取反+
  • 超硬核!数据结构学霸笔记,考试面试吹牛就靠

    万次阅读 多人点赞 2021-03-26 11:11:21
    注意事项: 声明一个引用,同时必须初始化,及声明代表哪一个变量。(作为函数参数时不需要初始化) 在声明一个引用后,不能再作为另一变量的引用。 3。不能建立引用数组。 1.2函数调用: 其实还是通过函数来理解...
  • 位运算求两个数的平均值

    千次阅读 2016-07-06 20:58:44
    位运算求两个数的平均值
  • 量子计算到底是什么鬼?

    万次阅读 2017-10-18 16:40:38
    几天,朋友圈被刷屏的非马云的云栖大会莫属,在此次大会上,阿里巴巴进行了系列重磅的发布,其中,阿里云联合中国科学院量子信息与量子科技创新研究院(上海)共同宣布“量子计算云平台”上线,应该算是众多发布...
  • 机器数是计算机中参与运算且带有(+)、(-)属性的二进制数 –引用自王达老师的《深入理解计算机网络》 1、计算机中的数如何表示符号?(计算机的数也是存在正负之分的,那么如何区分它们的正负呢?) 我之前的博文介绍...
  • Python给函数传递不定个数的参数

    万次阅读 多人点赞 2016-08-19 13:42:47
    ,而是本身一个列表 [1,2,3] ,会不会也能实现求和呢?比如有如下代码 a_list = [ 1 , 2 , 3 ] print add_int(a_list) 啊哦,报错了: unsupported operand type(s) for +=: 'int' and 'list' ,说 ...
  • 什么是递归函数?

    万次阅读 多人点赞 2018-02-21 09:42:10
    递归就是一个函数在的函数体内调用自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。 当函数在一直递推,直到遇到墙后返回,个墙就是结束条件。 所以递归要有两个...
  • 由 于假想了一个小数点的位置,而且个位置是约定好就不变的,所以叫做定点 定点的表示:原码、反码、补码   原码  原码的存在是最自然而然的。把人类书写的按转换成二进制,正常情况下,转换成的二...
  • 数据挖掘中所需的概率论与数理统计知识

    万次阅读 多人点赞 2012-12-17 19:24:47
    导言:本文从微积分相关概念,梳理到概率论与数理统计中的相关知识,但本文之压轴戏在本文第4节(彻底颠覆以前读书时大学课本灌输给你的观念,一探正态分布之神秘芳踪,知晓其前后发明历史由来),相信,每一个学过...
  • 个数交换算法(不需要临时变量)

    千次阅读 2011-12-19 10:58:13
    个数交换算法(不需要临时变量) 两个数交换算法(包含不用第3变量而直接交换的情况)2006-12-17 20:07对两个数进行交换,在C中可采用指针实现,而在C++可使用引用来实现,无论是用指针还是引用,都要借助第3...
  • 求两个数的平均值(三种方法)

    千次阅读 2019-08-17 15:36:14
    求两函数的平均值,很简单的想到可以用 (a+b)/2来实现。 代码块如下 方法 int Average_one(int a, int b){ return (a + b) / 2; } 但是如果a或b的值过大,会导致结果溢出。 方法二 把a比b多处的部分,分给b,...
  • 论补和补码的关系

    千次阅读 多人点赞 2016-12-04 14:32:02
    我们都知道,补 引申到 计算机中 就是 补码的概念, 可是 为什么呢? 我们先来 看看 各自的 定义…… 补: 在日常生活中,常常会遇到补的概念。例如,时钟指示为6点,欲使指示3点,既可按顺时针方向将分针转...
  • 定点与浮点数的区别

    千次阅读 2017-03-15 11:21:30
    典型的比如相对于浮点数的定点(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度...
  • 一个视角解读计算机编码-补码编码

    万次阅读 热门讨论 2011-02-09 21:13:00
    数学是一个完全抽象的学科,而计算机是这个学科的一种形象化的实现,显然无法处理一些仅在抽象意义上有意义的特殊“数字”,比如无穷之类的东西,。像数学中的加法,乘法这样运算,计算机必须给与实现,然而...
  • 十年磨剑——一夜成名背后是十年的努力

    千次阅读 多人点赞 2013-07-17 10:06:35
    Gmail的原开发主管Paul Buchheit曾经说过,Gmail的成功是...甚至有相当一部分人认为我们应该终止个项目,或者按照一个企业级的产品重做个项目——应该有一个本地的客户端程序,而不是个异想天开用JavaScript
  • 大数据经过10年发展,现在已经到了一个重要的分水岭阶段:通用性和兼容性能力成为大数据发展主流,运行的稳定可靠和使用的简捷、易开发、易维护成为产品发展的驱动力,而正是 Hadoop/Spark 类积木式模块框架无法...
  • APFS文件系统是苹果公司准备2017年正式推出的继HFS+之后最新的文件系统,据现有公开资料显示,这个文件系统具备当代其它文件管理系统所具备的诸多先进功能,将是统一所有苹果产品生态系统的唯一文件系统,可见是...
  • 射频、基带、调制解调器几个词究竟是什么关系?(网上看到不错的信息就转载过来了) 如果严格定义,依我理解,射频实际指的是...射频芯片和基带芯片是不是一个前端,一个后端? 题外话,DSP如果涉及通讯,在
  • 但不得不先说一下本文的前提,本文中所述的设计是一个不可行的设计,是不可能实现的!原因在于我在思考的过程中没有全盘应对。然而,虽然是一个失败的设计,也要把个过程记录下来,因为期间的思考过程是值得保存...
  • 释了分布式数据存储技术的进步和市场激励的强大结合,正合力形成一个更安全、更高效的网络。 在不到三十年的时间里,互联网已成为人类历史上最伟大的成就之一,因为以前在科学、技术和商业领域从未出现过如此看得见...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 178,658
精华内容 71,463
关键字:

一个相反数是它本身这个数是