zoukankan      html  css  js  c++  java
  • 大数相加和大数相乘

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

    //大数相加
    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--] = '';
    
        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] = '';
    
        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;
    }

    结果

  • 相关阅读:
    maven项目报错:Class path contains multiple SLF4J bindings
    ubuntu18.04 点击启动器实现窗口最小化
    Eclipse lombok get set方法报错
    try-with-resources 让java资源关闭代码更简洁
    yang文件语法格式
    RabbitMQ 交换器、持久化
    RabbitMQ 简介
    systemctl命令配置系统服务
    Karaf基础知识
    Linux shell模拟多线程拷贝
  • 原文地址:https://www.cnblogs.com/xiaocai-ios/p/7779752.html
Copyright © 2011-2022 走看看