当把基本的计算机语言掌握了,解决实际中的问题,大多就依靠自身的数学思维。
对于数论和概率论,尤其应用多。在图形处理中矩阵论和线性代数应用也是比较多的。
比如以下的两个问题:
1,若网卡地址全球唯一,计算机上可能有多个网卡,找到两台计算要多个网卡地址相加之后的数值相等的概率?
2,效验码的生成。
像身份证号,有一位效验码,像计算机网络传输的时候有一个奇偶效验码,像循环冗余效验码,像汉明码。效验码应用其实很广。
考虑下面一个场景。
有一个六位的十进制数字验证码,需要设计两位效验码,效验前面六位数字。
假如算法是这样的:六位分别乘以不同的素数,再相加,再取100内最大的素数的模,行到两位验证码。
其中素数表是自己随便取的。
有没有方式用数学方法论证,任意输错六位中的一位,效验码均可以检测出来。
算法C++实现如下
#include <string> #include <iostream> int GenerateTwoVerifyCode(const std::string prefixSixNum,std::string & twoVerifyCode); int _tmain(int argc, _TCHAR* argv[]) { std::string code; std::string sixnum="123456"; if (0 == GenerateTwoVerifyCode(sixnum,code)) { std::cout<<sixnum<<"-"<<code<<std::endl; } else { std::cout<<"error"<<std::endl; } std::cin.get(); return 0; } int GenerateTwoVerifyCode(const std::string prefixSixNum,std::string & twoVerifyCode) { int PrimeTable[6]={10061,10093,10151,11,13,17}; if (prefixSixNum.size()!= 6) { return -1; } int sum=0; for (int i=0;i< 6;i++) { char ch=prefixSixNum[i]; if (ch > '9' || ch < '0') { return -1; } sum +=(ch-'0')*PrimeTable[i]; } int result = sum % 97; char buf[4]={0}; sprintf(buf,"%02d",result); twoVerifyCode = buf; return 0; }
对于第一个问题,概率论方面的,不严密估算过,简化后,类似一个色子多扔几次,几次和的概率分布。
第二个问题,数论方面的,完全不晓得怎么下手。
先记录下来,待以后有数据理论再来算咯。