ZOJ 1205 - Martian Addition 解题报告

          http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1205

          题目说明:(把题目从GOOGLE翻译的结果修改而来)

          在22世纪,科学家们发现智能居民生活在火星。火星人非常喜欢数学。每一年,他们将举行一次火星算术大赛(计算机) ,竞赛内容是计算两个100位数的和,使用时间最少的人获得冠军。今年,他们还邀请地球上的人参加竞赛。 
          作为唯一代表地球,你发送给火星以展示人类的力量。幸运的是你带去的的笔记本电脑可以帮助您快速完成工作。现在剩下的问题只是写一个小程序来计算的两个给定数字的和。然而,在你开始写程序前要注意的是,火星人使用20进制数,因为它们通常有20个手指。 

          输入: 
          给定一些火星数,每个一行。火星数是由0到9 ,和小写字母 a 至 j 组成的(小写字母a开始分别代表10 , 11 , ... , 19 )。所有给定数字的位数不会超过100 。 

          输出: 
          对于每一对数字,在一行中输出它们的和。 

          样本输入: 

          1234567890 
          abcdefghij 
          99999jjjjj 
          9999900001 

          示例输出: 

          bdfi02467j 
          iiiij00000

 

          =================================================

          此题也是一道简单题目,和前一篇文章中的题目非常类似,过程是:

          (1)解析输入的一行字符串,并保存到一个char[]中。由于输入时从最高位写到个位,而数组中从个位到高位。因此这是一个类似于把字符串逆转的过程。同时,还要把字符转换为相应的实际数值。

          (2)按照加法的法则进行计算。

          (3)输出结果。这一步必须注意一些比较特殊的情况。例如如果输入是两个0,必须能打印出“0”。

 

          完整代码如下:

Code - 1205
/* ZOJ - 1205 , 20进制数想加 */
#include <stdio.h>
#include <string.h>

char* NUMS="0123456789abcdefghij";

/*分别是读取的输入行,加数a,b,计算结果c */
char line[105],a[105],b[105],c[105];

/*字符换算为实际数值,例如'a'->10,'b'->11*/
int CharToVal(char c)
{
    return strchr(NUMS, c)-NUMS;
}

/*解析输入*/
void CopyNum(char* dest, const char* line)
{
    int i,len=strlen(line);
    for(i=0;i<len;i++)
    {
        dest[i]=CharToVal(line[len-1-i]);
    }
}

/*打印加法结果,注意结尾如果为0也要打印0*/
void PrintResult()
{
    int i=101;
    while(c[i]==0) i--;
    
    if(i<0) i=0;        /*非常重要,可以保证至少要打印一个0。*/
    
    for(;i>=0;i--)
    {
        printf("%c", NUMS[c[i]]);
    }
    printf("\n");
}

/*做加法: c=a+b; */
void Add()
{
    int i;
    int k=0,sum;/*进位的数值*/
    for(i=0;i<102;i++)
    {
        sum = a[i] + b[i] + k;
        c[i] = sum%20;
        k = sum/20;
    }
}

int main()
{
    while(scanf("%s",line)!=EOF && strcmp(line,"END")!=0)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        CopyNum(a,line);            /*获取加数A*/
        scanf("%s",line);
        CopyNum(b,line);            /*获取加数B*/
        Add();                                /*C=A+B;*/
        PrintResult();                /*打印出结果*/
    }
    return 0;
}

时间: 2024-09-16 18:12:14

ZOJ 1205 - Martian Addition 解题报告的相关文章

ZOJ 1111 - Poker Hands 解题报告

          Poker Hands (比较两手牌的大小)           http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=111           题目描述:这道题要求比较两手牌的大小.每手牌都有5张牌组成,牌的大小的定义如下,首先确定这组牌的所属种类是下面哪一种(若同属同一种类,则根据该分类后面的比较规则继续比较,所属种类越靠后牌越大).           ● High Card:杂牌(不属于下面任何一种).

ZOJ - 1098 Simple Computer 解题报告

Simple Computers Time Limit: 1 Second      Memory Limit: 32768 KB You are to write an interpreter for a simple computer. This computer uses a processor with a small number of machine instructions. Furthermore, it is equipped with 32 byte of memory, o

ZOJ 1635 - Directory Listing 解题报告

       题目:1635 Directory Listing(列出目录)        http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=635         看描述好像是chenyue姐姐出的题目.这道题的大意是,给出一个UNIX文件系统的树,以及树节点的自身size,按要求列出它们,保持适当的缩进,并统计每个节点的总的size.输入的第一行代表根结点,每一个节点由name size或者*name size的形式组成(如

杭电ACM 2000-&amp;gt;2099 100道题 详细解题报告出炉

我去年暑假花了5天,把杭电ACM网站上2000到2099这100道题全AC了,又花了10来天精心写解题报告.里面包括题目.解题思路.编程技巧以及参考源码.所有代码都是使用C/C++写的. 最近整理资料时无意间发现,打包成chm文件和大家分享.我已经上传到CSDN上了.下载地址:http://download.csdn.net/source/492194 也可到我的Google Sites上下载. 题号 题名 题号 题名 2000 ASCII码排序 2001 计算两点间的距离 2002 计算球体积

ZOJ 3505. Yet Another Set of Numbers 解题报告

ZOJ 3505:Yet Another Set of Numbers 地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3505   题意:有一个数字集合,集合中的数遵循以下规则:   ( 1 ). 每个数字的最高位不是 0 ; ( 2 ). 每个数字包含最多 N 位,且只有 0,1,2,3 这四个数字可能出现(0 < N < 20); ( 3 ). 每个数字的相邻位不同(例如:301是有效的,300不是); (

ZOJ 2529 - A+B in Hogwarts 解题报告

          题目2529:A+B in Hogwarts           链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1535           题目描述:哈利波特去的魔法学院使用一种特殊进制法表示数字:第i位用第i个素数为进制(radix),例如"个位"的进制为第一个素数2,"十位"的进制为第二个素数3,"百位"的进制为第三个素数5,...依此类推.例

ZOJ 1010. Area 解题报告

ZOJ 1010. Area. 题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1010 基本题意:此题目给出 n 个点的坐标 (xi,yi ) ,要求求出这些点按顺序围成的多边形的面积.同时要求检测出不合法的多边形(例如非相邻边彼此相交的情况).     此题求面积不难,样例很容易就过了,但是提交 10+ 次基本都是 WA ,几乎失去信心.做题最郁闷的就是你不知道问题到底出在什么地方,可能改了很多次都没有试对地

ZOJ 1090 - The Circumference of the Circle 解题报告

      题目的链接在这里:       http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1090       题目描述很简单,大意是,给出三个点的坐标,设为A(x1,y1),B (x2, y2),C (x3, y3),然后求出通过这三点的圆的周长(保留两位小数).但推导公式却比较麻烦,我是这样来做的.       首先根据同一个弦的圆心角角度相同,不难得出,圆周的直径d= BC/ sin a = AC/ sin b =

ZOJ 1009, 1115, 1476, 1733, 2405 解题报告

        星期天这天一口气AC了五道题,除了1009外基本都可算是简单题.        (1)1009 Enigma:        http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1009        题目是讲解二战期间德国使用的密码机Enigma.明文通过按键,通过转盘(rotor)转换为密文.如下图所示为有1个转盘,一共有6个字母的情况,每击键一次,转盘转动一格.如果含有多个转盘,则以类似数字进制方式转动,