找错误很辛苦,但最后当看到全部正确的那一刹那,是我体验过的非常非常非常美好的感觉(或许我经历尚浅);
先上正确的,第一次有一个检测点是错的;
#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 */
}