题目链接
题目分析
(略)
解题思路
高精度运算 思路
AC程序(C++)
/**********************************
*@ID: 3stone
*@ACM: PAT. B1017 A除以B
*@Time: 17/2/28
*@IDE: DEV C++
*@KEY:莫要好高骛远,你先成为软微最优秀的那部分再抱怨其他!!!
***********************************/
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1010;
//大整数类型 结构体
struct bign {
int d[maxn];
int len;
bign() { //构造函数初始化
len = 0;
memset(d, 0, sizeof(d));
}
};
//把字符串表示的大整数转换成bign类型
bign change(char str[]) {
bign c;
for(int i = strlen(str) - 1; i >= 0; i--) { //逆序保存,因为操作都是从低位到高位进行
c.d[c.len++] = str[i] - '0';
}
return c;
}
//比较函数 (均正)
int compare(bign a, bign b) {
if(a.len > b.len) return 1; //a大
else if(a.len < b.len) return -1; //a小
else {
for(int i = a.len - 1; i >= 0; i--)
if(a.d[i] > b.d[i]) return 1;
else if(a.d[i] < b.d[i]) return -1;
return 0; //相等
}
}
/*高精度除法
思路:每一步:(上一步的余数*10 + 该步的位)作为被除数,够除则除,不够除商零;
最后:记得消去商中的前导零,同时至少保留一位
预处理: 函数中多传一个参数引用,用于返回余数 (设为全局变量也行)
*/
bign divide(bign a, int b, int& r) { //r记录最后的余数
bign c;
c.len = a.len; //被除数和商的每一位是一一对应的,因此先令长度相等
for(int i = a.len - 1; i >= 0; i--) {
r = r * 10 + a.d[i]; //和上一位余数组成被除数
if(r < b) c.d[i] = 0; //不够除,商0
else { //够除
c.d[i] = r / b; //商
r = r % b; //新余数
}
}
//消去商中的前导零 同时至少保留一位
while(c.len - 1 > 0 && c.d[c.len - 1] == 0)
c.len--;
return c;
}
//输出
void print(bign a) {
for(int i = a.len - 1; i >= 0; i--)
printf("%d", a.d[i]);
}
int main() {
char str[1010];
int k;
while(scanf("%s %d", str, &k) != EOF) {
bign a = change(str);
int r = 0;
a = divide(a, k, r);
print(a);
printf(" %d\n", r);
}
return 0;
}