大数相加和大数相乘

大数相加:
从后向前变量相加的字符串,并将当前位的数转为整型进行加法操作,并判断是否有进位,保存进位,以便进行下一次的操作。
代码:

//大数相加
char* add(char *str1, char *str2) {
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    int i = len1 - 1;
    int j = len2 - 1;
    int temp = 0;//进位
    int max = len1 > len2 ? len1 : len2;
    //定义结果字符
    char *ans = new char[max + 1];
    memset(ans, 0, max + 1);//初始化
    ans[max--] = '\0';

    for (; i >= 0 && j >= 0; --i, --j) {
        int sum = (str1[i] - '0') + (str2[j] - '0') + temp;
        if (sum >= 10) {//当前位结果大于10
            sum -= 10;
            temp = 1;//进位设为1
        }
        else {  
            temp = 0;
        }
        ans[max--] = sum + '0';
    }
    //第一个字符串还有剩余
    while (i >= 0) {
        ans[max--] = ((str1[i--] - '0') + temp) + '0';
        if (temp == 1) {
            temp = 0;
        }
    }
    //第二个字符串还有剩余
    while (j >= 0) {
        ans[max--] = ((str2[j--] - '0') + temp) + '0';
        if (temp == 1) {
            temp = 0;
        }
    }

    return ans;
}

大数相乘:

//字符串逆转
void reverseOrder(char *a, int begin, int end) {
    char temp;
    while (begin < end) {
        temp = a[begin];
        a[begin] = a[end];
        a[end] = temp;
        ++begin;
        --end;
    }
}

//大数相乘
char* mutil(char *str1, char *str2) {
    int len1 = strlen(str1);
    int len2 = strlen(str2);

    char *ans = new char[len1 + len2 + 1];
    memset(ans, '0', len1 + len2 + 1);
    ans[len1 + len2] = '\0';

    reverseOrder(str1, 0, len1 - 1);
    reverseOrder(str2, 0, len2 - 1);

    int mulitFag;//乘法进位
    int addFag;//加法进位
    for (int i = 0; i < len2; ++i) {//str2的每一位
        mulitFag = 0;
        addFag = 0;
        for (int j = 0; j < len1; ++j) {//str1的每一位
            int temp1 = (str1[j] - '0') * (str2[i] - '0') + mulitFag;//计算str2的一位和str1的每一位的积
            mulitFag = temp1 / 10;//计算乘法进位,如35/10=3进位为3
            temp1 = temp1 % 10;//求出个位数的值,如35%10=5
            int temp2 = (ans[i + j] - '0') + temp1 + addFag;//计算当前位+求积的个位数+和的进位
            addFag = temp2 / 10;//求和的进位,是否大于10
            ans[i + j] = temp2 % 10 + '0';//求出当前位的个位数,并转为字符
        }
        //保存一次乘积的最高位的数
        ans[i + len1] += mulitFag + addFag;
    }
    reverseOrder(ans, 0, len1 + len2 - 1);
    return ans;
}

主函数:

int main() {

    char data1[] =   "1234567891234567";
    char data2[] = "234567899876543221";
    char *str3 = add(data1, data2);
    cout << str3 << endl;

    char str1[] = "123";
    char str2[] = "57";//180
    char *str4 = mutil(str1, str2);
    if (str4[0] != '0')
        cout << str4;
    else
        cout << (str4 + 1);
    cout << endl;

    system("pause");
    return 0;
}

结果

posted @ 2016-09-04 21:23  zsper  阅读(257)  评论(0编辑  收藏  举报