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;
}

posted on 2013-09-22 17:15  程序猿猿猿  阅读(368)  评论(0编辑  收藏  举报

导航