大数据的加法、减法、乘法以及阶乘的计算问题(源代码附上)

  限于数据类型的长度有限,对于大数据的计算就无能为力了,这里主要是采用字符数组解决精度问题。

  加法、减法的思路差不多,主要就是采用我们固有的思维来计算,直接一位一位地相加。减法的话,先

判断2个数的大小,让较大的数始终在前面,并且改变相应的数据长度,把结果放在一个临时的缓冲区里面。

计算完毕后,再把数据写入到用户的缓冲区中,并且除去前面多余的0。乘法的计算就有点不同了,最大的

不同之处就是在于我们自己算乘法的时候还要算加法,这里我把加法合到了算乘法的过程中,也免除了溢出的

危险,计算量也小些了,每一位乘之前取结果当前位的值保存起来,然后连带进位一起加起来,就避免了最后

算加法的问题。

  算阶乘的时候,主要就是确定该给临时缓冲区分配多大内存。最后大概算了下,一位数分配1*1个,两位数就分配2*1个,

三位数就分配3*1。专门写了个函数用于返回分配数量大小。分配3个这么大的缓冲区,一个存取当前每一次的计算结果(逆序表示),

第二个复制该结果(逆序表示),第三个存取待乘的数据(顺序表示)。还是乘法结束后,加法也完毕了,然后进入下一次乘法。

怎么想的就是怎么做的。用gcc编译的时候,注意带上-lm选项,链接math库,下边是一个带简单错误处理的demo以及源代码。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>

int ystrlen( const char* str )
{
	int len;
	assert( str != NULL );
	len = 0;
	
	while( (*str--) !='\0' ) 
	{ 
		len++; 
	} 
	return len;
}

int get_allocate_num(const int* num1, const int* num2)
{
	return (*num1 >= *num2) ? *num1+1 : *num2+1;
}

void big_add(const char *num1, const char *num2, char *res)
{
	//res存储计算后的结果
	int len1 = strlen(num1);
	int len2 = strlen(num2);
	int i, j, k, num;
	char flag = 0;//进位标志
	char *temp_res, temp;//临时存取结果

	num = get_allocate_num(&len1, &len2);
	temp_res = (char *)malloc(num);

	i = len1 - 1;
	j = len2 - 1;
	for (k = num - 1; k >= 0; k--) {
		if (i >= 0 && j >= 0) {//加号两边都有数
			temp = num1[i--] + num2[j--] + flag;
			if (temp > 0x69) {//有进位
				temp_res[k] = temp - 0x3a;
				flag = 0x01;
			} else {
				temp_res[k] = temp - 0x30;
				flag = 0x0;
			}
		} else if (i >= 0 && j < 0) {//加号右边结束
			temp = num1[i--] + flag;
			if (temp > 0x39) {//有进位
				temp_res[k] = 0x30;
				flag = 0x01;
			} else {
				temp_res[k] = temp;
				flag = 0x0;
			}
		} else if (i < 0 && j >= 0) {//加号左边结束
			temp = num2[j--] + flag;
			if (temp > 0x39) {//有进位
				temp_res[k] = 0x30;
				flag = 0x01;
			} else {
				temp_res[k] = temp;
				flag = 0x0;
			}
		} else {//加号左边 右边刚结束
			temp = flag;
			if (temp) {//有无进位计算此次就结束
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值