目录
题目描述:
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
源代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
int a[1001];
vector<int>result;//因为不确定除完后能剩下几位所以用容器存放结果
int main()
{
string A;
int B;
cin >> A >> B;
for (unsigned int i = 0; i < A.size(); ++i)
{
a[i] = A[i] - 48;//对应数字字符(ASCII码)比原数字多4
}
int left = 0;//表示当前位除后的余数残留
for (unsigned int i = 0; i < A.size(); ++i)
{
a[i] += 10 * left;//加上前一位的残留
left = a[i] % B;
int curr = a[i] / B;
result.push_back(curr);//把当位置计算结果放入容器
}
unsigned int j = 0;
if (!result[j]&&result.size()!=1)//如果第一位为0且除法结果不是一位数,不输出前导0;
++j;
for (; j < result.size(); ++j)
printf("%d", result[j]);
cout << " " << left << endl;
return 0;
}
分析思路:
这道题目考的可能是大数除法?如果是完整版的大数除法我是不会的,因为我只学习了大数加法和大数乘法,不过好在这题只是一个简化版的大数除法———被除数限定只是一位。那么模拟笔算除法的过程就可以得出答案,用字符串存放被除数(因为1000位的数字即使是longlong类型也是放不下的)不过要在最后小心有没有多余的前导0.