当前位置:编程学习 > C/C++ >>

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

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

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

判断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++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,