美文网首页
1017 A除以B

1017 A除以B

作者: 初见还是重逢 | 来源:发表于2019-03-06 09:36 被阅读0次

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

    输入格式:

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

    输出格式:

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

    输入样例:

    123456789050987654321 7

    输出样例:

    17636684150141093474 3

    思路:

    由于题目要求计算不超过1000位的正整数,不能使用计算机的整数数据类型计算(范围不够),因此本题的解决方式是将人用纸笔计算除法的过程转换为程序,即:从最高位开始除,将余数记到下一位的进位当中,关键函数代码如下:

    int div(char *a, int b)//a是被除数,b是除数,div是余数
    //使用指针变量可以返回计算的除数的字符数组,同时还返回了余数
    {
        int i = 0;
        int div = 0;
        int temp;
        while (a[i] != '\0')
        {
        //将每一位字符转化为数字加上上一位的余数*10然后做除法
            temp = (a[i] - '0' + div*10) % b;//记录余数,如果前面有余数,需要加上借位
            a[i] = '0' + (a[i] - '0'+div*10) / b;//记录除数
            div = temp;
            i++;
        }
        return div;
    }
    

    另外,还要注意的是,还要注意结果为0,或者首位为0的特殊情况

    代码:

    A除以B

    //1017  A除以B
    #include<iostream>
    
    using namespace std;
    
    int div(char *a, int b)//a是被除数,b是除数,div是余数
    //使用指针变量可以返回除数的字符数组,同时还返回了余数
    {
        int i = 0;
        int div = 0;
        int temp;
        while (a[i] != '\0')
        {
            temp = (a[i] - '0' + div*10) % b;//记录余数,如果前面有余数,需要加上借位
            a[i] = '0' + (a[i] - '0'+div*10) / b;//记录除数
            div = temp;
            i++;
        }
        return div;
    }
    
    int main()
    {
        char A[1001];
        int B;
        int R;
        cin >> A >> B;
        R = div(A, B);
        if (A[0] != '0'||A[1]=='\0')cout << A[0];//注意除数为零或者首位为0的情况
        //如果除数为0 输出0;如果除数不为零,但是首位为0,首位0不输出
        int i = 1;
        while (A[i] != '\0')//从第二位开始输出
        {
            cout << A[i];
            i++;
        }
        cout << ' ' << R << endl;
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:1017 A除以B

          本文链接:https://www.haomeiwen.com/subject/ngizuqtx.html