工作中遇到的两个数学问题的记录

本文探讨了数学思维在编程中的重要性,特别是在数论、概率论、矩阵论及线性代数的应用。通过实例说明如何利用数学原理设计有效的校验码算法,并提出一种具体的六位数字校验码生成方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当把基本的计算机语言掌握了,解决实际中的问题,大多就依靠自身的数学思维。

对于数论和概率论,尤其应用多。在图形处理中矩阵论和线性代数应用也是比较多的。

比如以下的两个问题:

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;
}


对于第一个问题,概率论方面的,不严密估算过,简化后,类似一个色子多扔几次,几次和的概率分布。

第二个问题,数论方面的,完全不晓得怎么下手。

先记录下来,待以后有数据理论再来算咯。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值