【ACM】- PAT. B1017 A除以B 【数学问题 - 高精度运算】

题目链接
题目分析

(略)

解题思路

高精度运算 思路


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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值