高精度数取余(C\C++)

高精度数是OJ题目中最主要的一类题
数组去模拟高精度数是目前最常用的方法
除此之外,还可以通过使用string去模拟也是可以的

取余,是高精度数中主要的一个算法。
这里主要展示自己的高精度数取余的一个操作函数

算法思路:
模拟数学中关于除法,和余数的定义,根据竖式表达式运算得到
PS:注意点是,temp部分是必须的,避免更改原来的数据,所以不能使用
a[i] += flag;操作

    int Chu_left(int n){
        int flag = 0,temp = 0;
        for (int i = 0; i < size; ++i){
            flag *= 10;
            temp = a[i] + flag;
            flag = temp % n;
        }
        return flag;
    }

高精度数,附有取余操作的代码如下:

struct Num{
    int *a;
    int size;
    Num(){
        a = new int[100];
        size = 0;
    }
    Num(string &s){
        a = new int[s.size()];
        size = 0;
        for (int i = 0; i < s.size(); ++i){
            a[i] = s[i] - '0'; 
        }
        size = s.size();
    }
    int Chu_left(int n){
        int flag = 0,temp = 0;
        for (int i = 0; i < size; ++i){
            flag *= 10;
            temp = a[i] + flag;
            flag = temp % n;
        }
        return flag;
    }
    ~Num(){
        delete[] a;
    }
};

加上main函数部分,就可以做出SOJ1020题

int main(){
    int time, array_size, array[100], ans_array[100];
    cin >> time;
    while (time--) {
        cin >> array_size;
        for (int i = 0; i < array_size; ++i){
            cin >> array[i];
        }
        string num;
        cin >> num;
        Num n(num);
        cout<< "("; 
        for (int i = 0; i < array_size; ++i){
            cout << n.Chu_left(array[i]);
            if (i != array_size-1){
                cout << ",";
            } else {
                cout << ")\n";
            }
        }
    }
}

欢迎关注我用于做笔记的公众号:肥宅Sean笔记

高精度数取余(C\C++)_第1张图片

你可能感兴趣的:(算法,C++)