1017 A除以B

2019-03-06  本文已影响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;
}
上一篇 下一篇

猜你喜欢

热点阅读