PAT乙级.1017. A除以B (20)

来源:互联网 发布:js弹出确认对话框 编辑:程序博客网 时间:2024/05/16 15:43

题目

本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

输入格式

输入在1行中依次给出A和B,中间以1空格分隔。

输出格式

在1行中依次输出Q和R,中间以1空格分隔。

输入样例

123456789050987654321 7

输出样例

17636684150141093474 3

PAT链接


思路

数据结构

int r;  //用作余数struct bign{    int d[1000];    int len;    bign()    {        fill(d,d+sizeof(d)/sizeof(d[0]),0); //或memset(d,0,sizeof(d))        len = 0;    }};

代码

/*** @tag     PAT_B_1017* @authors R11happy (xushuai100@126.com)* @date    2016-9-10 22:16-* @version 1.0* @Language C++* @Ranking  930/309* @function null*/#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>using namespace std;int r;  //用作余数struct bign{    int d[1000];    int len;    bign()    {        fill(d,d+sizeof(d)/sizeof(d[0]),0); //或memset(d,0,sizeof(d))        len = 0;    }};bign change(char str[]){    bign a;    a.len = strlen(str);    for (int i = 0; i<a.len; i++)    {        a.d[i] = str[a.len - 1 - i] - '0';    }    return a;}int compare(bign a, bign b){    if (a.len > b.len)   return 1;    else if (a.len < b.len)  return -1;    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;}bign div(bign a, int b){    bign c;    c.len = a.len;    for (int i = a.len - 1; i >= 0; i--)    {        r = r * 10 + a.d[i];        c.d[i] = r / b;        r = r % b;    }    while (c.len - 1 > 0 && c.d[c.len - 1] == 0)    {        c.len--;    }    return c;}int main(int argc, char const *argv[]){    char str[1000];    int b;    scanf("%s %d", str, &b);    bign a = change(str);    bign c = div(a, b);    // 输出商    for (int i = c.len - 1; i >= 0; i--)    {        printf("%d", c.d[i]);    }    // 输出余数    printf(" %d\n", r);    return 0;}

收获

0 0