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

本文介绍了如何使用字符数组处理大数据的加法、减法、乘法和阶乘计算,解决了数据类型长度限制导致的精度问题。在加减法中,通过逐位操作完成计算;乘法中,将加法与乘法结合,减少溢出风险;阶乘计算则根据数字长度动态分配内存,分步进行。程序提供了简单的错误处理,并给出了GCC编译时的注意事项和运行截图。
摘要由CSDN通过智能技术生成

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

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

判断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) {//有无进位计算此次就结束
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值