2-36进制的加法运算,以十进制为中介

  1 #include<iostream>
  2 //#include<stdio.h>
  3 #include<string>
  4 #include<math.h>
  5 using namespace std;
  6 
  7 
  8 _int64 get(int n, string numStr) {
  9     int len = numStr.size();
 10     _int64  num1 = 0;
 11     /*if(n <= 10){
 12         for(int i =0; i < len;i++){
 13             char c = numStr[i];
 14             if( c >= '0' && c <= '9'){
 15                 num1 = num1 + (c -'0')*pow(n, len - i -1);
 16             }    
 17         }
 18     }*/
 19     //if(n > 10) {
 20         for(int i = 0; i < len; i++) {
 21             char c = numStr[i];
 22             if( c >= '0' && c <= '9'){
 23                 num1 = num1 + (c -'0')*pow(n, len - i -1);
 24             }
 25             if(c >= 'a' && c <= 'z') {
 26                 int num = c - 'a' + 10;
 27                 num1 = num1 + num * pow(n, len - i-1);
 28             }
 29         }
 30     //}
 31     return num1;
 32 }
 33 void invget(int n, _int64 sum, char* numStr) {
 34     int k;//余数
 35     _int64 num = sum;//
 36     int count = 0;
 37     char* p = numStr;
 38     while(num!=0) {
 39         k = num % n;
 40         num = num/n;
 41         *numStr = (char)(k+'0');
 42         if(n > 10) {
 43             if(k >= 10) {
 44                 *numStr = (char)('a' + k - 10);
 45             }
 46         }
 47         numStr++;
 48         count++;
 49     }
 50     if(count == 0) {
 51         *numStr++ = '0';
 52         *numStr = '\0';
 53         return;
 54     }
 55     int j = 0;
 56     int end = count - 1;
 57     while(end >= j){
 58         char c = p[j];
 59         p[j] = p[end];
 60         p[end] = c;
 61         j++;
 62         end--;
 63     }
 64     *numStr = '\0';
 65 }
 66 bool check(int n, string numStr) {
 67     for(int i = 0 ; i <numStr.size(); i++ ) {
 68         char c = numStr[i];
 69         if(!( (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z'))) {
 70             return false;
 71         }
 72 
 73         if(n > 10) {
 74             if( c >= 'a' + n - 10) {
 75                 return false;
 76             }
 77         }
 78         if( n <= 10) {
 79             if( c >= '0' + n ) {
 80                 return false;
 81             }
 82         }
 83 
 84     }
 85     return true;
 86 }
 87 int main() {
 88     int n;
 89     string numStr1;
 90     string numStr2;
 91     cin >> n;
 92     cin >> numStr1 >> numStr2;
 93     //检查输入是否有错误
 94     if(!check(n, numStr1) || !check(n, numStr2)) {
 95         cout << -1 << endl;
 96         return 0;
 97     }
 98 
 99     _int64  num1 = get(n, numStr1);
100     _int64  num2 = get(n, numStr2);
101     printf("%d\n",num1);
102     printf("%d\n",num2);
103     _int64 sum = num1 + num2;
104     int len = numStr1.size() > numStr2.size()? numStr1.size():numStr2.size();
105     char* sumStr = new char[len+2];
106     invget(n, sum, sumStr);
107     cout << sumStr << endl;
108     
109     return 0;
110 }

 

posted @ 2014-06-14 22:46  soul390  阅读(297)  评论(0)    收藏  举报