【PAT B1016】部分A+B (C语言)

找错误很辛苦,但最后当看到全部正确的那一刹那,是我体验过的非常非常非常美好的感觉(或许我经历尚浅);
先上正确的,第一次有一个检测点是错的;
在这里插入图片描述

#include <stdio.h>
int A[10];									/* 存A */
int B[10];									/* 存B */
int R[101];									/* 存结果 */
int DA;
int DB;
void read_AB();
int cal_print();
void print_result(int i);
/********************* 读取A和B,以及DA和DB *****************************/
void read_AB(){
	int c;

	while((c = getchar()) != ' ')
		++A[c - '0'];
	DA = (getchar() - '0');
	A[0] = 0;
	getchar();
	while((c = getchar()) != ' ')
		++B[c - '0'];
	DB = (getchar() - '0');
	B[0] = 0;
}
/****************************** 计算 PA+PB  *****************************/
int cal_print(){
	int carry, i;
	
	carry = 0;
	if(A[DA] == 0 && B[DB] == 0){
		printf("0");
		return 0;
	}
	for(i = 0; A[DA] != 0 && B[DB] != 0; ++i){
		R[i] = ( (DA + DB + carry) % 10);	/* 两数相加再加进位 留下个位数 */	
		carry = ((DA + DB + carry) / 10);	/* 两数相加再加进位除以10的商 就是向前进的位数 */	
		--A[DA];
		--B[DB];
	}
	if(A[DA] != 0){							/* 还没有加完 */
		for(; A[DA] != 0; ++i){
			R[i] = ((DA + carry) % 10);		/* DA 加上进位数 留下个位数 */
			carry = ((DA + carry) / 10);	/* DA 加上进位数除以10的商,就是向前进的位数 */
			--A[DA];
		}
	}
	if(B[DB] != 0){
		for(; B[DB] != 0; ++i){
			R[i] = ((DB + carry) % 10);		/* DB 加上进位数 留下个位数 */
			carry = ((DB + carry) / 10);	/* DB 加上进位数除以10的商,就是向前进的位数 */
			--B[DB];
		}
	}
	if(carry != 0)							/* 进位数不为零 */
		R[i] = carry;
	else
		--i;
	print_result(i);						/* i是结果计算结束时的下表,即结果的第一个数开始的地方 */
}
/************************ 输出结果 ************* **********************/
void print_result(int i){
	for(; i >= 0; --i)
		printf("%d", R[i]);
}
int main(){
	DA = DB = 0;
	for(int i = 0; i < 10; ++i){
		A[i] = 0;
		B[i] = 0;
	}
	read_AB();					/* 读输入 题目说的第一行 */
	cal_print();				/* 计算并输出PA PB */
}

这个是因为把DA[0]和DB[0] 没有清空,所以错了。

在这里插入图片描述
对不起,有一个测试点过不去;
思路:
在这里插入图片描述
这个代码和正确的代基本思路是一样的,但有些地方不一样

#include <stdio.h>
int A[10];
int B[10];
int DA;
int DB;
void read_AB();
int print_PAPB();
void print_same_size();
void print_di_size();
void print_one(int m, int n);
/********************* 读取A和B,以及DA和DB *****************************/
void read_AB(){
	int c;

	while((c = getchar()) != ' ')
		++A[c - '0'];
	DA = (getchar() - '0');
	getchar();
	while((c = getchar()) != ' ')
		++B[c - '0'];
	DB = (getchar() - '0');
}
/****************************** 输出PA 和 PB *****************************/
int print_PAPB(){
	int temp1, temp2;
	if(A[DA] == 0 && B[DB] == 0){			/* 如果PA和PB的长度都为零 */
		printf("0");
		return 0;
	}else if(A[DA] != 0 && B[DB] != 0){		/* 如果PA和PB的长度都不为零 */
		if(A[DA] == B[DB])					/* 如果两个长度相同 */
			print_same_size();
		else{								/* 如果两个长度不相同 */
			if(A[DA] < B[DB]){				/* 如果PA的长度小于PB 将信息交换,因为*/
				temp1 = DA;					/* print_di_size 默认PA比PB长 */
				temp2 = A[DA];
				DA = DB;
				A[DA] = B[DB];
				DB = temp1;
				B[DB] = temp2;
			}
			print_di_size();	
		}
	}else{									/* 如果PA和PB的长度有一个为零 */
		if(A[DA] == 0 )						
			print_one(B[DB], DB);				/* 只输出PB */
		else
			print_one(A[DA], DA);				/* 只输出PA */
	}
	return 0;
}
/************************ 输出PA和PB长度相同的情况 **************************/
void print_same_size(){						/* A[DA] == B[DB]  == 长度 */
	if(DA + DB >= 10){						/* 进位输出 */	
		printf("1");						/* 先输出一个1 */
		for(; A[DA] > 1; --A[DA])			/* 输出总长度-1个 */
			printf("%d", (DA + DB - 10 + 1));
		printf("%d", (DA + DB - 10));		/* 再输出个位 */
	}
	else{									/* 不进位输出 */
		for(; A[DA] > 0; --A[DA])	
			printf("%d", (DA + DB));
	}
}
/************************ 输出PA和PB长度不相同的情况 *************************/
void print_di_size(){
	 if(DA + DB >= 10){						/* 进位输出 */
		if(DA == 9){					
			printf("1");
			for(; (A[DA] - B[DB]) > 0; --A[DA])
				printf("0");
			for(; B[DB] > 1; --B[DB])
				printf("%d", (DA + DB - 10 + 1));
			printf("%d", (DA + DB - 10));
		}else{
			for(; (A[DA] - B[DB]) > 1; --A[DA])
				printf("%d", DA);
			printf("%d", (DA + 1));
			for(; B[DB] > 1; --B[DB])
				printf("%d", (DA + DB - 10 + 1));
			printf("%d", (DA + DB - 10));
		}
	 }else{									/* 不进位输出 */
		for(; (A[DA] - B[DB]) > 0; --A[DA])
			printf("%d", DA);
		for(; B[DB] > 0; --B[DB])
			printf("%d", DA + DB);
	 }
}
/********************************* 输出m个n **************************************/
void print_one(int m, int n){
	for(; m > 0; --m)
		printf("%d", n);
}
int main(){
	DA = DB = 0;
	for(int i = 0; i < 10; ++i){
		A[i] = 0;
		B[i] = 0;
	}
	read_AB();					/* 读输入 题目说的第一行 */
	print_PAPB();				/* 输出PA PB */
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值