[ACM] ZOJ Martian Addition (20进制的两个大数相加)

Martian Addition


Time Limit: 2 Seconds      Memory Limit: 65536 KB


  In the 22nd Century, scientists have discovered intelligent residents live on the Mars. Martians are very fond of mathematics. Every year, they would hold an Arithmetic Contest on
Mars (ACM). The task of the contest is to calculate the sum of two 100-digit numbers, and the winner is the one who uses least time. This year they also invite people on Earth to join the contest.

As the only delegate of Earth, you‘re sent to Mars to demonstrate the power of mankind. Fortunately you have taken your laptop computer with you which can help you do the job quickly.
Now the remaining problem is only to write a short program to calculate the sum of 2 given numbers. However, before you begin to program, you remember that the Martians use a 20-based number system as they usually have 20 fingers.

Input:

You‘re given several pairs of Martian numbers, each number on a line.

Martian number consists of digits from 0 to 9, and lower case letters from a to j (lower case letters starting from a to present 10, 11, ..., 19).

The length of the given number is never greater than 100.

Output:

For each pair of numbers, write the sum of the 2 numbers in a single line.

Sample Input:

1234567890
abcdefghij
99999jjjjj
9999900001

Sample Output:

bdfi02467j
iiiij00000

Source: Zhejiang University Local Contest 2002, Preliminary

解题思路:

求两个20进制的数的和,用数组模拟相加就能够。

代码:

#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <map>
using namespace std;
map<int,char>change;

char num[105];
int add1[105];
int add2[105];
int ans[105];
int jin[105];

void prepare()
{
	change[0]=‘0‘;change[1]=‘1‘;change[2]=‘2‘;change[3]=‘3‘;
	change[4]=‘4‘;change[5]=‘5‘;change[6]=‘6‘;change[7]=‘7‘;
	change[8]=‘8‘;change[9]=‘9‘;change[10]=‘a‘;change[11]=‘b‘;
	change[12]=‘c‘;change[13]=‘d‘;change[14]=‘e‘;change[15]=‘f‘;
	change[16]=‘g‘;change[17]=‘h‘;change[18]=‘i‘;change[19]=‘j‘;
}

int main()
{
	prepare();
	while(cin>>num)
	{
	    memset(add1,0,sizeof(add1));
	    memset(add2,0,sizeof(add2));
	    memset(jin,0,sizeof(jin));
		int len1=strlen(num);
		int t=0;
		for(int i=len1-1;i>=0;--i)
		{
			if(!(num[i]>=‘0‘&&num[i]<=‘9‘))
				add1[t++]=num[i]-87;
			else
				add1[t++]=num[i]-‘0‘;
		}
		cin>>num;
		int len2=strlen(num);
		t=0;
		for(int i=len2-1;i>=0;--i)
		{
			if(!(num[i]>=‘0‘&&num[i]<=‘9‘))
				add2[t++]=num[i]-87;
			else
				add2[t++]=num[i]-‘0‘;
		}
		//输入处理完成
		//for(int i=0;i<len2;i++)
          //  cout<<add2[i];
        //cout<<endl;

		int len=max(len1,len2);
		for(int i=0;i<=len;i++)
        {
            int temp=add1[i]+add2[i]+jin[i];
            if(temp>=40)
            {
                ans[i]=temp-40;
                jin[i+1]=2;
            }
            else if(temp>=20)
            {
                ans[i]=temp-20;
                jin[i+1]=1;
            }
            else
                ans[i]=temp;
        }
        if(ans[len])
            cout<<change[ans[len]];
        for(int i=len-1;i>=0;i--)
            cout<<change[ans[i]];
        cout<<endl;
	}
	return 0;
}
时间: 2024-10-01 07:15:13

[ACM] ZOJ Martian Addition (20进制的两个大数相加)的相关文章

2-36进制的 两个数相加

最近在很多场合都看见设计模式的影子,一直以来,都投入主要时间在搞算法与数据结构,很来发现设计模式真的很重要.有的时候代码的可维护.可重用.可扩展确实胜过单纯的算法效率高.所以拾起大牛书籍<大话设计模式>同时参考网上诸大牛的博客,开始我的设计模式之旅.由于平时编程时用C/C++,现在是Java,也练练Java语法. 今天先介绍一下命令模式. 概念: 命令模式(Command):将一个请求封装成一个对象,从而使你可用不同的请求对象对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作.

【ACM】大数据+任意进制转换 jobdu 1080

[九度OJ] 1080 进制转换 题目描述: 将M进制的数X转换为N进制的数输出. 输入: 输入的第一行包括两个整数:M和N(2<=M,N<=36).下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出. 输出: 输出X的N进制表示的数. 样例输入: 16 10 F 样例输出: 15 提示: 输入时字母部分为大写,输出时为小写,并且有大数据. 这题考察的比较综合,进制转换+大数据 很久没有做ACM的题目了,且拿这个练练手,大整数模板是用的王道论坛的模板-贴出来备

ACM--26进制加法--HDOJ 2100--Lovekey--大数--字符串处理

HDOJ题目地址:传送门 Lovekey Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7783    Accepted Submission(s): 2519 Problem Description XYZ-26进制数是一个每位都是大写字母的数字. A.B.C.-.X.Y.Z 分别依次代表一个0 ~ 25 的数字,一个 n 位的26

(2、8、10、16)进制之间的转换的背后的故事

今天在涉及到String型转换为Int型时候想到的一个问题,带符号数的转换问题,发现需要再回头看看进制的问题.找到点资料,觉得还可以,借取一段放在这里与备后查. 16进制:用16作为基数的计数系统.用数字0-9和字母a-f(或其大写A-F)表示10到15. 十六进制数转换成十进制数 2进制,用两个阿拉伯数字:0.1: 8进制,用八个阿拉伯数字:0.1.2.3.4.5.6.7: 10进制,用十个阿拉伯数字:0到9: 16进制,用十六个阿拉伯数字……等等,阿拉伯人或说是印度人,只发明了10个数字啊?

7.3 进制转换

7-4 NumberTrans.c 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define STACK_INIT_SIZE 100 4 #define SIZE_INCREMENT 5 5 typedef struct //栈结构 6 { 7 int *base; //栈底 8 int *top; //栈顶 9 int stacksize; //栈大小 10 }SqStack,*SQSTACK; 11 int StackInit(SQS

高精度的进制转换

1 #include <stdio.h> 2 #include <string.h> 3 4 char str[1000];//输入字符串 5 int start[1000],ans[1000],res[1000]; //被除数,商,余数 6 //res[]存的是余数,其最后结果的逆序为所求的结果 7 //转换前后的进制 8 const int oldBase = 10; 9 const int newBase = 2; 10 11 void change() 12 { 13 //

for循环与进制转换

for循环 for循环基本结构 for+空格+in+可迭代对象+冒号(#整型和布尔值不能进行循环) 缩进 循环体 for i in 'asdf':#i是变量名 pass#pass和...是占位符 print(i)#当在外围打印i时,值应该是for循环变量最后所获得的值 示例 name="你好啊" for x in name:#将name中的字符循环依次赋值给x print(x) #结果为 #你 #好 #啊 count=0#因为字符串的元素索引第一个是0,所以count赋值为0 whil

数组中hashCode就是内存地址,以及汉字幻化为16进制或10进制

int[] arr4={1,2,3,4,5}; System.out.println("arr4: "+arr4); System.out.println("arr4.hashCode: "+arr4.hashCode()); //将hashCode值转化为16进制的两种方式 System.out.println(Integer.toString(366712642,16));//将整数转化为16进制的数为:15db9742 System.out.println(I

大数进制转换问题

在数据结构课关于栈的这一章中,我们都学过用"模2取余法"来将一个10进制数转换为一个二进制数,进而可以推广到"模n取余法",经其转换为n进制(n任意指定). 确实,这是一个很基础的题目,可你是否想过如果这个10进制数是一个大数(其位数可能上千位,此时用一般数据类型肯定是会溢出的),那么这个问题又如何来求解呢? 当然,也许你会说很简单嘛,自己写一个大数类(当然至少要写一个大数除法才行),或者你用的是Java这种现代化语言,就更轻松了,直接用BigInteger这样的大