大数相加与相乘算法实现

时间:2019-02-19
本文章向大家介绍大数相加与相乘算法实现,主要包括大数相加与相乘算法实现使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

 

大数相加 sample

123456789 + 987654321 = ?

 

 

大数相乘 思维参考

接下来我们再来聊一聊关于大数相乘算法,其实相乘算法思路基本上和相加没有区别,也是通过代码模拟我们曾经学得的乘法的

大数相乘 sample

835 * 49 = ? 

 

 

void Reverse(char *str, int n)
{
    int i;
    
    for (i = 0; i < n / 2; i++)
    {
        char tmp;
        tmp = str[i];
        str[i] = str[n-i-1];
        str[n-i-1] = tmp;
    }
}

//本算法的时间复杂度O(n),空间复杂度N,只申请一个临时数组
char * sumFunc(char *a, char * b, int lenA, int lenB) {
    //算法一进来应该做数据合法性检查
    char * result = (char *)malloc(N * sizeof(char));
    memset(result, '0', N); //结果数组先置于0方便计算
    int i = lenA -1;  //数组a的下标
    int j = lenB -1;  //数组b的下标
    int k = 0;        //结果数组的下标
    int maxLenIndex = lenA > lenB ? lenA : lenB;
    while (maxLenIndex > 0) {
        int aValue = i>=0 ? a[i] - '0' : 0;
        int bValue = j>=0 ? b[j] - '0' : 0;
        int temp = aValue + bValue + result[k] - '0';
        result[k] = temp % 10 + '0';
        result[k+1] = temp / 10 + '0';
        k++;
        i--;
        j--;
        maxLenIndex --;
    }
    int sumLen = result[k] == '0' ? k : k+1;  //获得字符串的长度
    
    memset(result+sumLen, '\0', N-sumLen);//设置'\0'标记字符串结尾
    Reverse(result, sumLen);
    return result;
}

//本算法的时间复杂度O(n*m),空间复杂度N,只申请一个临时数组
char * multiFunc(char *a, char * b, int lenA, int lenB) {
    char *result = (char *)malloc(N*sizeof(char));
    memset(result, '0', N);
    Reverse(a, lenA); //d低位到高位
    Reverse(b, lenB); //d低位到高位
    
    for (int i=0; i<lenA; i++) {
        int addMark = 0;  //又一次操作result[i+j]加完的进位
        int mulMark = 0;  //a[i]*b[j]乘完的进位
        for (int j = 0; j<lenB; j++) {
            int r1 = (a[i] - '0') * (b[j] - '0') + mulMark + addMark; //计算a[i]*b[j],再加上低位的进位
            mulMark = r1 / 10;  //乘完需要向高位的进位
            int r2 = r1%10;  //当前result[i+j]位的结果数值
            int r3 = result[i+j] - '0' + r2; //操作result[i+j],结果可能超过10
            result[i+j] = r3 % 10 + '0';   //操作result[i+j],是是否需要进位
            addMark = r3/10;   //获得需要去高位进位的具体数值
        }
        result [lenB + i] += addMark + mulMark;
    }
    int mulLen = '0' == result[lenA + lenB - 1] ? lenA + lenB - 1 : lenA + lenB;
    memset(result+mulLen, '\0', N-mulLen);//设置'\0'标记字符串结尾
    Reverse(result, mulLen);
    return result;
}


@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    char a[9] = "123456789";
    char b[10] = "1987654321";
    char * result = sumFunc(a, b, 9, 10);
    //result = 0x0000600001458dd0 "2111111110"
    char a1[4] = "9456" ;
    char b1[5] = "93456" ;
    char * result1 = multiFunc(a1, b1, 4, 5);
    //result = 0x0000600001458dd0 "2111111110"
    int j = 0;
    j++;
    // Do any additional setup after loading the view, typically from a nib.
}


@end