本题要求计算 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的特殊情况
代码:
//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;
}
网友评论