【PAT B1017】A除以B (C语言)

两个方案,第一边除一边输出。第二个是除完得商,先保存,再输出。
在这里插入图片描述
思路
用数组储存A(A 是不超过 1000 位的正整数)可能很大。按照基本除法一位一位除,得商输出

#include <stdio.h>
#define MAX_A 1000
int A[MAX_A];
int B;									/* 除数 */
int num;								/* A 被除数有多少位 */

void read_AB();
void division_print();
/******************** 读入A读如A[],和B *************************/
void read_AB(){
	int c;

	for(num = 0; (c = getchar()) != ' '; ++num)
		A[num] = (c - '0');
	B = (getchar() - '0');
}
/*********************** 做除法,并输出 **************************/
void division_print(){
	int d;								/* 被除数  dividend*/
	int r;								/* 余数 remainder */
	int Q;								/* 商 */

	if(num == 1 && A[0] < B){			/* A 只有一位且还小于B(除数)*/
		printf("0");
		r = A[0];
	}else{
		d = r = 0;
		for(int j = 0; j < num; ++j){
			d = r*10 + A[j];			/* 将A分解,被除数 = 上一次的余数*10 + 当前A中的某位 */
			Q = d / B;						
			r = d % B;
			if(j == 0 ){
				if(Q != 0)
					printf("%d", Q);
			}else
				printf("%d", Q);
		}
	}
	printf(" ");
	printf("%d", r);
}
int main(){
	int i;

	B = 0;
	for(i = 0; i < MAX_A; ++i)
		A[i] = 0;
	read_AB();
	division_print();					/* 一边除一边输出 */
}

下边这个是把商保存了,再输出
在这里插入图片描述

#include <stdio.h>
#define MAX_A 1000
int A[MAX_A];
int Q[MAX_A];
int B;									/* 除数 */
int num;								/* A 被除数有多少位 */
int j;									/* Q 商有多少位 */

void read_AB();
int division();
void print_result(int R);
/******************** 读入A读如A[],和B *************************/
void read_AB(){
	int c;

	for(num = 0; (c = getchar()) != ' '; ++num)
		A[num] = (c - '0');
	B = (getchar() - '0');
}
/************************** 做除法 ****************************/
int division(){
	int d;								/* 被除数  dividend*/
	int r;								/* 余数 remainder */

	d = r = 0;
	for(j = 0; j < num; ++j){
		d = r*10 + A[j];				/* 将A分解,被除数 = 上一次的余数*10 + 当前A中的某位 */
		if(d >= B){						/* 被除数大于等于除数 */
			Q[j] = d / B;
			r = d % B; 
		}else{							/* 被除数小于除数 */
			Q[j] = 0;
			r = A[j];
		}
	}
	return r;							/* 返回余数 */
}
/*********************** 输出结果 ****************************/
void print_result(int R){
	int i;

	if(Q[0] == 0 && Q[1] == 0)			/* A < B,它的商为零 */
		printf("0");
	else{								/* A >= B */
		i = 0;
		if(Q[i] == 0)					/* 排除商的第一位为零 */
			++i;
		for(; i < j; ++i)				/* 当还没有输出完所有的商 */
			printf("%d", Q[i]);
	}
	printf(" ");
	printf("%d", R);					/* 输出余数 */
}
int main(){
	int i;

	B = 0;
	for(i = 0; i < MAX_A; ++i){
		A[i] = 0;
		Q[i] = 0;
	}
	read_AB();
	i = division();						/* 余数 */
	print_result(i);					/* 把余数传进去输出结果 */
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值