C++ 高精度除法运算(c=a/b)

一、题目:一个大整数除以一个整数(低精度数)

    输入一个大于0的大整数a,长度不超过100位,求出除以一个整数b,输出得到的商和余数。

   输入: 2132104848488485 13

   输出:164008065268345 0

二、思路:

      1.输入大整数的数字串和整数b

         用string存储大整数的数字串,用int存储整数b

      2.将数字串从低位往高位存储到数组a中

      3.利用竖式计算,c=a/b

         (1)首先,另余数为x=0;

         (2)让余数乘以10,和高位的第一个位置的数相加,然后除以b,得到此位置的商;

         (3)求出此时的余数x;

         (4)接着往高位的下一位走,重复(2)(3)步骤,直到最后一位;

      4.输出商和余数

 

三、实现程序

//  main.cpp
//  highPrecision9:一个高精度数除以一个整数
//  c = a / b
//  Created by ChanJose on 2019/1/19.
//  Copyright © 2019年 ChanJose. All rights reserved.
//  测试数据:
//  输入:
//      2132104848488485 13
//  输出:
//      164008065268345 0

#include <iostream>
#include <string>
using namespace std;

const int MAX = 101;

int main(int argc, const char * argv[]) {
    int b, i, la, lc, x;
    string str;
    int a[MAX], c[MAX];
    
    while(cin >> str >> b) { // 1.输入大整数和整数b
        memset(a, 0, sizeof(a)); // 清零
        memset(c, 0, sizeof(c));
        // 获取大整数的长度
        la = (int)str.size();
        for(i = 0; i < la; i++)
            a[la-i-1] = str[i] - '0'; // 2.将数字串从低位往高位存储到数组a中
        // 3.计算c=a/b
        x = 0; // 余数初始为0
        for(i = la-1; i >= 0; i--) {
            c[i] = (x * 10 + a[i]) / b; // 将高位得到的余数乘以10,再加上新位置的数,再除以b
            x = (x * 10 + a[i]) % b; // 得出余数
        }
        lc = la;
        while(lc > 1 && c[lc-1] == 0) // 4.删去多余的0
            lc--;
        // 5.从高位往低位输出商
        for(i = 0; i < lc; i++)
            cout << c[lc-i-1];
        // 空格输出余数
        cout << " " << x << endl;
    }
    return 0;
}

测试结果:


版权声明:本文为chuanzhouxiao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。