二十进制数的加法

CSDN编程挑战里的题目

在二十进制中,我们除了使用数字0-9以外,还使用字母a-j(表示10-19),
给定两个二十进制整数,求它们的和。 输入是两个二十进制整数,且都
大于0,不超过100位; 输出是它们的和(二十进制),且不包含首0。我
们用字符串来表示二十进制整数。

可惜我提交了6次才正确,我想要确保有抽奖的可能,需要申请两个帐号,一个做炮灰,另一个一击命中.

  1 #include <cmath>
  2 #include <cstring>
  3 #include <cstdio>
  4 
  5 static int GetNum(char c)
  6 {
  7     if (c >= '0' && c <= '9')
  8     {
  9         return c - '0';
 10     }
 11     else if (c >= 'a' && c <= 'z')
 12     {
 13         return c + 10 - 'a';
 14     }
 15     else if (c >= 'A' && c <= 'Z')
 16     {
 17         return c + 10 - 'A';
 18     }
 19     else
 20     {
 21         return -1;
 22     }
 23 }
 24 
 25 static char GetChar(int num)
 26 {
 27     if (num >= 0 && num <= 9)
 28     {
 29         return '0' + num;
 30     }
 31     else
 32     {
 33         return 'A' + num - 10;
 34     }
 35 }
 36 
 37 static void InverseString(char* szString)
 38 {
 39     unsigned int len = strlen(szString);
 40     char c;
 41     for (unsigned int i = 0; i < len/2; i++)
 42     {
 43         c = szString[i];
 44         szString[i] = szString[len - 1 - i];
 45         szString[len - 1 - i] = c;
 46     }
 47 }
 48 
 49 static void Calculate(const char* szA, const char* szB, char* szDest, unsigned int jinzhi = 20)
 50 {
 51     bool ad = false;
 52     unsigned int lenA = strlen(szA);
 53     unsigned int lenB = strlen(szB);
 54 
 55     unsigned int pos = 0;
 56     int valueA;
 57     int valueB;
 58     int valueAdd;
 59 
 60     while (pos < lenA || pos < lenB)
 61     {
 62         if (pos < lenA)
 63         {
 64             valueA = GetNum(szA[pos]);
 65         }
 66         else
 67         {
 68             valueA = 0;
 69         }
 70 
 71         if (pos < lenB)
 72         {
 73             valueB = GetNum(szB[pos]);
 74         }
 75         else
 76         {
 77             valueB = 0;
 78         }
 79 
 80         valueAdd = valueA + valueB;
 81         if (ad)
 82         {
 83             valueAdd++;
 84         }
 85         ad = (valueAdd >= jinzhi);
 86 
 87         if (ad)
 88         {
 89             valueAdd -= jinzhi;
 90         }
 91 
 92         szDest[pos] = GetChar(valueAdd);
 93         pos++;
 94     }
 95 
 96     if (ad)
 97     {
 98         szDest[pos] = '1';
 99         pos++;
100     }
101     szDest[pos] = 0;
102 }
103 
104 void CalculateRadix20(const char* x, const char* y, char* szDest)
105 {
106     char szA[256];
107     char szB[256];
108 
109     strcpy(szA, x);
110     strcpy(szB, y);
111 
112     InverseString(szA);
113     InverseString(szB);
114 
115     Calculate(szA, szB, szDest);
116     InverseString(szDest);
117 }

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值