测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A24198. 高精除

填空题 困难

题目描述

高精除

题目描述

高精除以高精,求它们的商和余数。

输入

输入两个低于300位的正整数。

输出

输出商和余数。

输入样例

1231312318457577687897987642324567864324567876543245671425346756786867867867
1231312318767141738178325678412414124141425346756786867867867

输出样例

999999999748590
179780909068307566598992807564736854549985603543237528310337

参考答案

#include<bits/stdc++.h> using namespace std; #define N 305 //从数字数组a的第i位开始,删除高位的0 void setLen(int a[], int i) { while(a[i] == 0 && i > 1)//去除多余的0 i--; a[0] = i; } //将字符数组转化为数字数组 数字数组从第1位置到第len位置,从低位到高位保存各位数字,第0位置保存数字位数 void toNum(char s[], int a[]) { a[0] = strlen(s); for(int i = 1; i <= a[0]; ++i) a[i] = s[a[0] - i] - '0'; } //输出数字数组 void showNum(int a[]) { for(int i = a[0]; i >= 1; --i) cout << a[i]; cout << endl; } //将数字数组b复制到数字数组a之中 void numcpy(int a[], int b[]) { for(int i = 0; i <= b[0]; ++i) a[i] = b[i]; } //比较两个数字数组 如果a比b大,返回1,如果a比b小,返回-1,如果二者相等,返回0 int numcmp(int a[], int b[]) { if(a[0] > b[0])//如果a的位数比较多 return 1; else if (a[0] < b[0])//如果b的位数比较多 return -1; else { for(int i = a[0]; i >= 1; --i) { if(a[i] > b[i]) return 1; else if(a[i] < b[i]) return -1; } return 0; } } //高精减高精 前提:a比b大 void Minus(int a[], int b[], int r[]) { int i; for(i = 1; i <= a[0] || i <= b[0]; ++i) { if(a[i] < b[i]) { a[i+1]--; a[i] += 10; } r[i] = a[i] - b[i]; } setLen(r, i); } //高精度除以高精度 //a = a*10+num,即在数字数组的个位添加一位数,0 <= num <= 9,如2添加1后变为21 void addNum(int a[], int num) { if(a[0] == 1 && a[1] == 0)//如果a是0,那么就把个位设为num a[1] = num; else { for(int i = a[0]; i >= 1; --i)//数组移位 a[i+1] = a[i]; a[1] = num; a[0]++; } } //高精度除法中的减法代替除法操作,实际就是除法的另一种实现方式 //已知商一定是0~9的数字。a是被除数 b是除数 返回值为商,计算后数组a保存的是余数 int divideByMinus(int a[], int b[]) { int q = 0, r[N];//q:商(减的次数) r:临时结果 while(numcmp(a, b) >= 0) { memset(r, 0, sizeof(r)); Minus(a, b, r); numcpy(a, r);//将a设为上次减法的结果 q++; } return q; } //高精度数字除以高精度数字 void Divide(int a[], int b[], int r[], int x[])//r:商 x:余数 { for(int i = a[0]; i >= 1; --i) { addNum(x, a[i]); r[i] = divideByMinus(x, b); } setLen(r, a[0]); } int main() { int a[N] = {}, b[N] = {}, r[N] = {}, m[N] = {};//必须都初始化为0 r:商 m:余数 char s[N]; cin >> s; toNum(s, a); cin >> s; toNum(s, b); Divide(a, b, r, m); showNum(r); showNum(m); return 0; }
上一题 下一题