1017 A除以B(附详细注释,逻辑分析)

写在前面

  • 实现思路
    • 字符串存储待读入的大数字符串,结构体bign封装大数字符串
    • 将大数字符串转存为bign
    • 辗转相除法计算除数、余数(不足补0)
    • 去掉高位0
  • 个人知识盲点,题目有难度

测试用例

input:
123456789050987654321 7
output:
17636684150141093474 3
input:
2 7
output:
0 2

ac代码

  • 算法笔记(倒序辗转相除,略不适应)
#include
#include 
#include
using namespace std;
struct bign
{
    int d[1010];
    int len;
    bign()
    {
        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-i-1] - '0';
    return a;
}
bign divide(bign a, int b, int& 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;
        else
        {
            c.d[i] = r/b;
            r=r%b;
        }
    }
    while((c.len-1>=1) && (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 str1[1010], str2[1010];
    int b, r=0;
    scanf("%s%d", str1, &b);
    bign a = change(str1);
    print(divide(a, b, r));
    printf(" %d", r);

    return 0;
}
  • 实验代码(正序,辗转相除)
    • 测试点1错误,已解决
      • 第2个测试用例
#include
#include 
#include
using namespace std;
struct bign
{
    int d[1010];
    int len;
    bign()
    {
        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[i] - '0';
    return a;
}
bign divide(bign a, int b, int& r)
{
    bign c;
    c.len = a.len;
    for(int i=0; i<a.len; i++)
    {
        r = r*10 + a.d[i];
        if(r<b) c.d[i] = 0;
        else
        {
            c.d[i] = r/b;
            r=r%b;
        }
    }
    return c;
}
void print(bign a)
{
    bool flag = false;
    for(int i=0; i<a.len; i++)
    {
        if((a.d[i]!=0)&&(!flag)) flag = true;
        if(flag) printf("%d", a.d[i]);
        if((!flag) && (i==a.len-1)) printf("%d", a.d[i]);
    }
}
int main()
{
    char str1[1010];
    int b, r=0;
    scanf("%s%d", str1, &b);
    bign a = change(str1);
    print(divide(a, b, r));
    printf(" %d", r);
    return 0;
}
  • 实验代码ac(优化版本2,推荐)
    • 字符串存储、操作
    • 辗转相除(重点)
    • 结果循环,判断输出
#include 
using namespace std;

int main()
{
    string a, ans;
    int b=0, r=0;
    cin >> a >> b;
    for(int i=0; i<a.size(); i++)
    {
        r = r*10 + a[i]-'0';
        if(r<b) ans += '0';
        else
        {
            ans += (r/b+'0');
            r = r%b;
        }
    }
    bool flag = false;
    for(int i=0; i<ans.size(); i++)
    {
        if(!flag)
            if((ans[i]!='0') || (i==ans.size()-1))
                flag = true;
        if(flag) printf("%c", ans[i]);
    }
    printf(" %d", r);
    return 0;
}

学习代码

#include 
using namespace std;
int main() {
    string s;
    int a, t = 0, temp = 0;
    cin >> s >> a;
    int len = s.length();
    t = (s[0] - '0') / a;
    if ((t != 0 && len > 1) || len == 1)
        cout << t;
    temp = (s[0] - '0') % a;
    for (int i = 1; i < len; i++) {
        t = (temp * 10 + s[i] - '0') / a;
        cout << t;
        temp = (temp * 10 + s[i] - '0') % a;
    }
    cout << " " << temp;
    return 0;
}

你可能感兴趣的:(PAT(乙级),算法比赛相关)