
Adding Reversed Number.docx
3页Adding Reversed NumbersMalidinesia 的古典喜剧演员(Antique Comedians of Malidinesia,ACM)喜欢演喜剧,而不太喜欢演悲剧但不幸的是,大多数古典戏剧是悲剧所以 ACM 的戏剧导演决定将一些悲剧改编为喜剧显然,虽然所有的事物都改成了它们的反面,但因为必须保持剧本原有的意义,所以这项工作是很困难的反向数是将一个阿拉伯数字按相反的次序写把第一个数字写成最后一个数字,反之亦然例如,在悲剧中主人公有 1245 只草莓,现在则有 5421 只草莓了在本题中,数字的所有前导零要被省略所以,如果数字结尾有零,写反向数时零要被略去(例如,1200的反向数是 21) 此外,在本题中,反向数没有零结尾ACM 需要对反向数进行计算请您将两个反向数相加,并输出它们的反向和当然,结果不是唯一的,因为一个数可以是几个数的反向形式(例如 21 在反向前可以是 12, 120 或 1200) 为此,本题设定没有 0 因为反向而丢失(例如,设定原来的数是 12) 输入输入输入由 N 个测试用例组成输入的第一行仅给出正整数 N,然后给出若干测试用例 每个测试用例一行,由 2 个由空格分开的正整数组成。
这是要相加的要被反向的数输出输出对每个测试用例,输出一行,仅包含一个整数,将两个反向数进行求和,之后再反向在输出时把前导 0 略去样例输入样例输入样例输出样例输出324 14358 754305 7943419981试题来源:试题来源:ACM Central Europe 1998测试地址:测试地址:POJ 1504,,ZOJ 2001,,UVA 713试题解析设 Num[0][0]为被加数的长度,被加数为 Num[0][1..Num[0][0]];Num[1][0]为加数的长度,加数为 Num[1][1..Num[1][0]];Num[2][0]为和的长度,和为 Num[2][1..Num[2][0]]首先,分别输入被加数和加数的数串,在舍去了尾部的无用 0 后存入 Num[0]和 Num[1],再将它们反向存储然后,Num[0]和 Num[1]相加,得出和数组 Num[2]最后反向输出 Num[2],注意略去尾部的无用 0参考程序:参考程序:#include //预编译命令#include #include #include using namespace std; //使用 C++标准程序库中的所有标识符int Num[3][1000]; //Num[0][0]为被加数的长度,被加数为 Num[0][1..Num[0][0]];加数为 Num[1][0]为加数的长度,加数为 Num[1][1..Num[1][0]]; Num[2][0]为和的长度,和为Num[2][1..Num[2][0]]void Read(int Ord) // Ord==0,输入和处理被加数;Ord==1,输入和处理加数{int flag=0;string Tmp;cin>>Tmp; //读数串for(int i=Tmp.length()-1;i>=0;i--) //由右而左分析每个数符{If (Tmp[i]>'0') flag = 1; //舍去尾部的无用 0 后存入高精度数组 Num[Ord]if (flag) Num[Ord][++Num[Ord][0]] = Tmp[i] - '0';}for(int i=Num[Ord][0],j=1;i>j;i--,j++) //计算反向数 Num[Ord]{flag = Num[Ord][i];Num[Ord][i] = Num[Ord][j];Num[Ord][j] = flag;}}void Add(){Num[2][0] = max(Num[0][0],Num[1][0]); //加数和被加数的最大长度作为相加次数for(int i=1;i 0) //处理最高位的进位Num[2][0] ++;int flag = 0;for(int i=1;i0) flag = 1;if (flag) printf(“%d“,Num[2][i]);}printf(“\n“);}int main() //主函数{ //主函数开始int N; //输入测试用例数cin>>N;for(N;N;N--) //输入和处理每个测试用例{memset(Num,0,sizeof(Num)); //高精度数组初始化为 0Read(0); //输入处理和被加数Read(1); //输入处理和加数Add(); //相加后反向输出}return 0;}。












