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
分析,位数太大吗,不能使用整型变量,只能使用字符数组,实现每一位的遍历。
从第一位开始,可以被整除的放在数组 b
中,然后下一位。不能整除的和下一位一起计算。
但要再考虑第一位和最后一位的情况。输出余数。
可以使用以下测试样例
测试点1(原测试点)
输入
5 7
7 7
输出
0 5
1 0
测试2(检测遇到 0 的时候是否可以进行)
输入
14010 7
1410 7
输出
2001 3
210 3
#include<stdio.h>
#include<string.h>
int main()
{
char a[1010],b[1010];int A;scanf("%s %d",a,&A);int n = strlen(a); //用于计算除数的每位个数 int j = 0;for(int i = 0;i < n;i++) //如果只有 1 位数 {
a[i] = a[i]-'0';}if(n == 1){
b[0] = a[0]/A;a[0] = a[0]%A;printf("%d %d",b[0],a[0]);return 0;}if(a[0]/A) //第一位要特殊考虑,下面的情况需要加 0 {
b[j++] = a[0]/A;a[1] = a[0]%A*10 + a[1];}else{
a[1] = a[0]*10 + a[1];}for(int i = 1;i < n;i++){
if(a[i] == 0) //考虑为 0 时 {
b[j++] = 0;continue;}if(a[i]/A == 0) //满足这一位不能被整除 {
if(i == n-1) //最后一位特殊考虑 {
b[j] = a[i]/A;continue;}b[j++] = 0; a[i+1] = a[i]*10 + a[i+1];}else //此为可以被整除 {
if(i == n-1){
b[j] = a[i]/A;a[i] = a[i]%A;continue;}b[j++] = a[i]/A;a[i+1] = a[i]%A*10 + a[i+1];}}for(int i = 0;i < n;i++)printf("%d",b[i]);printf(" %d",a[n-1]);}