本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
思路
大整数加减乘除要用结构体去实现手算的过程。
代码
#include<cstdio>#include<cstring>struct BigNumber {int number[1001];int length;BigNumber() { /* 构造函数,给成员赋初值 */length = 0;memset(number, 0, sizeof(number));}};BigNumber change(char*); /* 将字符串转换成BigNumber对象的函数 */BigNumber divide(BigNumber, int, int&);int main() {char input1[1001];int B;scanf("%s%d", input1, &B);int remainder = 0;BigNumber A = change(input1);BigNumber result = divide(A, B, remainder);/** 输出BigNumber对象 */for(int i = result.length - 1; i >= 0; i--) {printf("%d", result.number[i]);}printf(" %d", remainder);return 0;}/******************函数实现***************************/BigNumber change(char* input) {BigNumber result;result.length = strlen(input);for(int i = 0; i < result.length; i++) {result.number[i] = input[result.length - 1 -i] - '0';}return result;}BigNumber divide(BigNumber a, int b, int& remainder) {BigNumber result;result.length = a.length;for(int i = a.length - 1; i >= 0; i--) {remainder = remainder * 10 + a.number[i]; /* 和上一位遗留的余数组合 */if(remainder < b) { /* 不够除,该位为0 */result.number[i] = 0;}else { /* 够除 */result.number[i] = remainder / b; /* 商 */remainder = remainder % b; /* 计算新的余数 */}}while(result.length - 1 >= 1 && result.number[result.length - 1] == 0) {result.length--; /* 去除高位的0,同时至少保留一位最低位 */}return result;}
