Hoodlum1980 (fafa)'s Technological Blog

Languages mainly using and digging: C / CPP, ASM, C#, Python. Other languages:Java.

博客园 首页 新随笔 联系 订阅 管理

          题目2529:A+B in Hogwarts

          链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1535

          题目描述:哈利波特去的魔法学院使用一种特殊进制法表示数字:第i位用第i个素数为进制(radix),例如“个位”的进制为第一个素数2,“十位”的进制为第二个素数3,“百位”的进制为第三个素数5,...依此类推。例如,十进制数2表示为10,十进制数6被表示为100。现在要求你为哈利波特写一个简单的计算器用于计算a+b的结果,每一行输入魔法学院的数字a和b,两个数字用空格分割,数字的每一位用逗号分割,要求计算出a+b的结果,并用魔法学院的表示法表示(注意,输入数字最多不超过25位)。

          示范输入:

          1,0 2,1
          4,2,0 1,2,0
          1 10,6,4,2,1

          示范输出:

          1,0,1
          1,1,1,0
          1,0,0,0,0,0

          该题目的难度不大,但对输入的解析和正确输出上有一定的技巧性,因此不能算特别简单的题。看到该题目的第一印象,我想把输入的数字a和b都转换为常规的int整数,然后再把a+b的结果转换为该特殊进制,但是这个转换过程会比常规的进制转换复杂一些,例如把1,0,0转换为10进制的过程是1*(2*3)+0*(2)+0=6;

          因此我们马上改变思路,采用类似大数算法的方法,即使用一个数组来表示数字,然后把每一位使用的进制存储到一个数组r中,即r中存储前25个素数。然后计算a+b的过程和大数加法完全一致,唯一不同的是,大数加法的每一位都使用10进制,而这里每一位使用的进制都不同。

          我们首先写出前25个素数,并存储到一个固定的数组中,我们可以用下面的代码来获取(请注意下面的代码完全是辅助性质,和最终题目的解并无关系):

Code_求出前25个素数

          下面我们给出ZOJ 2529题目的完整代码:

Code_ZOJ_2529_Solution

 

          最后值得一提的是,解析输入的代码:ParseInput方法,用于把形如"10,6,4,2,0"这样的字符串解释到一个int数组(dest)内,是dest数组成为{0,2,4,6,10,0,...}。

          用于把结果输入的方法,PrintResult,要注意当计算结果为0和1这样的比较特殊的情况,必须也应该能正确输出。这些比较临界的细节是尤其需要注意的地方。

posted on 2008-11-15 01:47  hoodlum1980  阅读(728)  评论(0编辑  收藏  举报