2.100位内的20进制数相加
/*在22世纪,科学家们发现智能居民生活在火星。火星人非常喜欢数学。每一年,他们将举行一次火星算术大赛(计算机) ,竞赛内容是计算两个100位数的和,使用时间最少的人获得冠军。今年,他们还邀请地球上的人参加竞赛。
*
* 作为唯一代表地球,你发送给火星以展示人类的力量。幸运的是你带去的的笔记本电脑可以帮助您快速完成工作。现在剩下的问题只是写一个小程序来计算的两个给定数字的和。然而,在你开始写程序前要注意的是,火星人使用20进制数,因为它们通常有20个手指。
*
* 输入:
*
* 给定一些火星数,每个一行。火星数是由0到9 ,和小写字母 a 至 j 组成的(小写字母a开始分别代表10 , 11 , ... , 19 )。所有给定数字的位数不会超过100 。
*
* 输出:
* 对于每一对数字,在一行中输出它们的和。
*
* 样本输入:
*
* 1234567890
* abcdefghij
*示例输出:
bdfi02467j
* */
/*算法实现:字符串-》数组-》数组表示的数相加运算-》字符串*/
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
int code(char in){//字符串转换为数组编码
switch(in){
case '0':
return 0;
break;
case '1':
return 1;
break;
case '2':
return 2;
break;
case '3':
return 3;
break;
case '4':
return 4;
break;
case '5':
return 5;
break;
case '6':
return 6;
break;
case '7':
return 7;
break;
case '8':
return 8;
break;
case '9':
return 9;
break;
case 'a':
return 10;
break;
case 'b':
return 11;
break;
case 'c':
return 12;
break;
case 'd':
return 13;
break;
case 'e':
return 14;
break;
case 'f':
return 15;
break;
case 'g':
return 16;
break;
case 'h':
return 17;
break;
case 'i':
return 18;
break;
case 'j':
return 19;
break;
default:
cout<<"字符输入有误!!"<<endl;
break;
}
}
int *transplate(char*s){//酱紫副传转换成数组,用于计算
int len = strlen(s);
int *a = new int[len];
for(int i = 0;i<len;++i){
a[i] = code(s[i]);
}
return a;
}
int *add(char *s1,char *s2){//计算两个数组表示的多位20进制数相加的具体算法
int len1 = strlen(s1);
int len2 = strlen(s2);
int max;
int min;
int *maxstr;
int *minstr;
if(len1 > len2){
max = len1;
min = len2;
maxstr = transplate(s1);
minstr = transplate(s2);
}else{
max = len2;
min = len1;
maxstr = transplate(s2);
minstr = transplate(s1);
}
for(int i = 0;i<max;++i){
cout<<maxstr[i]<<" ";
}
cout<<endl;
for(int i = 0;i<min;++i){
cout<<minstr[i]<<" ";
}
cout<<endl;
int *a = new int[max+1];
for(int i = 1;i<=max;++i){
a[i] = maxstr[i-1];
}
a[0] = 0;
int m = 0;
int temp = 0;
int j = 1;
for(;j<=min;++j){
temp = m + maxstr[max-j] + minstr[min-j];
if(temp > 19){
m = 1;
a[max+1-j] = temp - 20;
}else{
m = 0;
a[max +1 -j] = temp;
}
}
a[max+1-j] = a[max+1-j] + m;
return a;
}
char code_c(int s){//数组转换成字符串编码
switch(s){
case 0:
return '0';
break;
case 1:
return '1';
break;
case 2:
return '2';
break;
case 3:
return '3';
break;
case 4:
return '4';
break;
case 5:
return '5';
break;
case 6:
return '6';
break;
case 7:
return '7';
break;
case 8:
return '8';
break;
case 9:
return '9';
break;
case 10:
return 'a';
break;
case 11:
return 'b';
break;
case 12:
return 'c';
break;
case 13:
return 'd';
break;
case 14:
return 'e';
break;
case 15:
return 'f';
break;
case 16:
return 'g';
break;
case 17:
return 'h';
break;
case 18:
return 'i';
break;
case 19:
return 'j';
break;
default:
cout<<"输入数字有误!!"<<endl;
break;
}
}
char *transplate_c(int *p,int len){//数组转换错字符串
int j = 0;
int lent = len;
while(p[j] == 0){
--lent;
++j;
}
char *s = new char[lent];
for(int i = 0;i<len-j;++i){
s[i] = code_c(p[i+j]);
}
return s;
}
int main(){
char *s = "1234567890";//测试数据
char *s1 = "abcdefghij";//测试数据
int *p = add(s,s1);
for(int i = 0;i<=10;++i){
cout<<p[i]<<" ";
}
cout<<endl;
char *e = transplate_c(p,1+strlen(s));
cout<<e<<endl;
return 0;
}