1017 A除以B (20 分)
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
从这道题学到的东西
1.很大的数进行除法的方法。
没有其他的了.
方法:
1.先将被除数的第n位取出来,判断第n位是否比除数大,如果不如除数大就把第n位乘10加上第n+1位。(n从1开始)
2.重复1中的操作直达取到第m位时,这个数大于除数。
3.用这个数除以除数,将得到的商和余数分开保存。(每次得到的商按顺序存在数组中)
4.判断刚刚取到的第m位是否为最后一位,如果是则输出商和余数。
5.如果不是则将余数*10加上m+1位。
6.用这个数除以除数,将得到的商和余数分开保存。直到取到最后一位为止。(每次得到的商按顺序存在数组中)
7.输出结果。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string dividend; //被除数
int divisor; //除数
int quotient[1000]; //商
int remainder; //余数
int temp_remainder; //临时存放被余数
int k = -1; //记录第一个不为0的数的位置
int q = 0; //作为商的下标
cin >> dividend;
cin >> divisor;
for (int i = 0; i < dividend.length(); i++) //处理掉前导为0的情况
{
if (dividend[i] - '0' != 0)
{
k = i;
break;
}
}
if ((dividend[k] - '0') < divisor && k == dividend.length() - 1) //如果是一位数,并且小于除数的情况
{
cout << "0" << ' ' << dividend[k] - '0';
return 0;
}
temp_remainder = dividend[k] - '0'; // 上述方法中的1 2步
while (temp_remainder < divisor)
{
temp_remainder = temp_remainder * 10 + (dividend[++k] - '0');
}
quotient[q++] = temp_remainder / divisor; //上述方法中的第3步
remainder = temp_remainder % divisor;
temp_remainder = remainder;
while (++k < dividend.length()) //上述方法中的4 5 6步
{
temp_remainder = temp_remainder * 10 + (dividend[k] - '0');
quotient[q++] = temp_remainder / divisor;
remainder = temp_remainder % divisor;
temp_remainder = remainder;
}
for (int i = 0; i < q; i++) //上述方法中的第7步
{
cout << quotient[i];
}
cout << ' ' << remainder;
return 0;
}