大数据的加法、减法、乘法以及阶乘的计算问题(源代码附上)
限于数据类型的长度有限,对于大数据的计算就无能为力了,这里主要是采用字符数组解决精度问题。
加法、减法的思路差不多,主要就是采用我们固有的思维来计算,直接一位一位地相加。减法的话,先
判断2个数的大小,让较大的数始终在前面,并且改变相应的数据长度,把结果放在一个临时的缓冲区里面。
计算完毕后,再把数据写入到用户的缓冲区中,并且除去前面多余的0。乘法的计算就有点不同了,最大的
不同之处就是在于我们自己算乘法的时候还要算加法,这里我把加法合到了算乘法的过程中,也免除了溢出的
危险,计算量也小些了,每一位乘之前取结果当前位的值保存起来,然后连带进位一起加起来,就避免了最后
算加法的问题。
算阶乘的时候,主要就是确定该给临时缓冲区分配多大内存。最后大概算了下,一位数分配1*1个,两位数就分配2*1个,
三位数就分配3*1。专门写了个函数用于返回分配数量大小。分配3个这么大的缓冲区,一个存取当前每一次的计算结果(逆序表示),
第二个复制该结果(逆序表示),第三个存取待乘的数据(顺序表示)。还是乘法结束后,加法也完毕了,然后进入下一次乘法。
怎么想的就是怎么做的。用gcc编译的时候,注意带上-lm选项,链接math库,下边是一个带简单错误处理的demo以及源代码。
[cpp]
#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) {//有无进位计算此次就结束
temp_res[0] = 0x31;
strncpy(res, temp_res, num);
res[num] = '\0';
} else {//此时既无进位
strncpy(res, &temp_res[1], num-1);
res[num-1] = '\0';
}
}
}
free(temp_res);
}
int big_cmp(const char *num1, const int *len1, const char *num2, const int *len2)
{
int i;
if (*len1 > *len2) {//减数大
return 1;
} else if (*len1 < *len2) {//被减数大
return -1;
} else {
for (i = 0; i < *len1; i++) {
if (num1[i] > num2[i]) {
return 1;
} else if (num1[i] < num2[i]) {
&
补充:软件开发 , C++ ,