任意进制数的加法

实现一个2-35位任意进制的加法。输入有整型表示进制是多少;两个需要相加的字符串。对于不合法的输入输出-1.

比如:

20

jj

10

10j

30

gggt

1

ggh0

程序实现如下:

  1 #include <string>
  2 #include <iostream>
  3
  4 #define MAX_NUM 100000 //最多这么多位字符。发现再多的话程序崩溃
  5 using namespace std;
  6
  7 void reversal(string &s,unsigned long long len)
  8 {
  9     for (unsigned long long i = 0; i < len / 2; i++)
 10     {
 11         char tmp = s[i];
 12         s[i] = s[len - i - 1];
 13         s[len - i - 1] = tmp;
 14     }
 15 }
 16
 17 bool mytoInt(string s, int a[], unsigned long long len,unsigned short N)
 18 {
 19     for (unsigned long long i = 0; i < len; i++)
 20     {
 21         if (s[i] >= ‘0‘ && s[i] <= ‘9‘)
 22         {
 23             a[i] = s[i] - 48;
 24         }
 25         else if (s[i] >= ‘a‘ && s[i] <= ‘z‘)
 26         {
 27             a[i] = s[i] - ‘a‘ + 10;
 28         }
 29         if (a[i] >= N)//判断输入是否合法;比如进制是10,但输入了a这样的字符。
 30         {
 31             return true;
 32         }
 33     }
 34     return false;
 35 }
 36 char myInttoChar(int a)
 37 {
 38     if (a <= 9)
 39     {
 40         return a + 48;
 41     }
 42     else
 43     {
 44         return a + ‘a‘ - 10;
 45     }
 46
 47 }
 48 int main()
 49 {
 50     unsigned short N;
 51     string stra, strb;
 52
 53     while (cin >> N )
 54     {
 55         int sa[MAX_NUM] = { 0 }, sb[MAX_NUM] = {0};
 56
 57         cin >> stra >> strb;
 58         if (N < 2 || N > 35)
 59         {
 60             cout << -1 << endl;
 61             break;
 62         }
 63         if (stra == "" || strb == "")
 64         {
 65             cout << -1 << endl;
 66             break;
 67         }
 68         unsigned long long lena = stra.length();
 69         unsigned long long lenb = strb.length();
 70         reversal(stra,lena);
 71         reversal(strb,lenb);
 72         bool flag1 = mytoInt(stra, sa,lena,N);
 73         bool flag2 = mytoInt(strb, sb,lenb,N);
 74         if (flag1 || flag2)
 75         {
 76             cout << -1 << endl;
 77             break;
 78         }
 79         unsigned long long i, j;
 80
 81         if (lena > lenb)//a的长度大于等于b
 82         {
 83             i = 0;
 84             for (i = 0; i < lenb; i++)
 85             {
 86                 sa[i] = sa[i] + sb[i];
 87                 sa[i + 1] = sa[i + 1] + sa[i] / N;
 88                 sa[i] = sa[i] % N;
 89             }
 90             while (sa[i] >= N)//a剩下的位数进行调整;高位
 91             {
 92                 if (i == lena - 1)
 93                 {
 94                     int tmp = sa[i] / N;
 95                     sa[i] = sa[i] % N;
 96                     cout << myInttoChar(tmp);
 97                     break;
 98                 }
 99                 sa[i + 1] = sa[i + 1] + sa[i] / N;
100                 sa[i] = sa[i] % N;
101                 i++;
102             }
103             //输出
104             unsigned long long max = lena > i ? lena : i;//若最高位有进位则i大
105             for (int j = max - 1; j >= 0; j--)
106             {
107                 cout << myInttoChar(sa[j]);
108             }
109             cout << endl;
110         }
111         else if (lena < lenb)
112         {
113             i = 0;
114             for (i = 0; i < lena; i++)
115             {
116                 sb[i] = sb[i] + sa[i];
117                 sb[i + 1] = sb[i + 1] + sb[i] / N;
118                 sb[i] = sb[i] % N;
119             }
120             while (sb[i] >= N)
121             {
122                 if (i == lenb - 1)
123                 {
124                     int tmp = sb[i] / N;
125                     sb[i] = sb[i] % N;
126                     cout << myInttoChar(tmp);
127                     break;
128                 }
129                 sb[i + 1] = sb[i + 1] + sb[i] / N;
130                 sb[i] = sb[i] % N;
131                 i++;
132             }
133             // 输出
134             unsigned long long max = lenb > i ? lenb : i;//若最高位有进位则i大
135             for (int j = max - 1; j >= 0; j--)
136             {
137                 cout << myInttoChar(sb[j]);
138             }
139             cout << endl;
140         }
141         else if (lena == lenb)
142         {
143             i = 0;
144             for (i = 0; i < lenb - 1; i++)
145             {
146                 sa[i] = sa[i] + sb[i];
147                 sa[i + 1] = sa[i + 1] + sa[i] / N;
148                 sa[i] = sa[i] % N;
149             }
150             sa[i] = sa[i] + sb[i];
151             if (sa[i] >= N)
152             {
153                 int tmp = sa[i] / N;
154                 sa[i] = sa[i] % N;
155                 cout << myInttoChar(tmp);
156             }
157             //print
158             for (int i = lena - 1; i >= 0; i--)
159             {
160                 cout << myInttoChar(sa[i]);
161             }
162             cout << endl;
163         }
164
165     }
166
167     return 0;
168 }
时间: 2024-12-29 23:39:41

任意进制数的加法的相关文章

C实现任意进制数的转化

该实例要求使用C实现一个无符号整数到[2,16]进制数的转换.这个还是比较好想的,就是对该无符号整数不断的斤进制数d取余数,取商,一直做这样的运算,直到商为0为止,将所有的余数按照从后往前的顺序穿起来,就是转换后的进制数. 下面上我的代码: #include <stdio.h> /** 用于声明char数组的长度 **/ #define M (sizeof(unsigned int) * 8) int trans(unsigned int m,int d,char s[]); /** * @b

十进制转任意进制数

//十进制转任意进制 #include <iostream> #include <stack> using namespace std; int main() { int T; int n, a, p; cin >> T; while (T--) { stack<int> s; //n 为十进制,p为要转换的进制 cin >> n >> p; while (n) { a = n % p; s.push(a); n /= p; } wh

C++实现将十进制数转换为小于等于九的任意进制

//十进制转换为小于等于九的任意进制数 #include<iostream> #include<string> #include<stack> using namespace std; stack<int> num; void change(int N,int M) { if(N<0||M<=1) { cout<<"error!"<<endl; return; } while(N>0) { num

Python版任意进制转换

def decimalToAny(num,n): baseStr = {10:"a",11:"b",12:"c",13:"d",14:"e",15:"f",16:"g",17:"h",18:"i",19:"j"} new_num_str = "" while num != 0: remai

递归 将一个十进制数转化为任意进制字符串

Create All kinds of guns. 设计重点: 1 基类作接口 2 继承类是各种不同的类 3 构建工厂类,然后根据需要创造不同的类,可以传入关键字,或者索引等. #pragma once #include <string> #include <iostream> using namespace std; //Base class class Gun { public: virtual string description() { return "Gener

java 的任意进制间转换

直接上代码: public class Main { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("十进制转换到其它进制:"); int x = 123 ; String str1 = Integer.toHexString(x) ; ///10进制转换成16进制的字符串 System.out.println(str1); String st

2~62位任意进制转换(c++)

进制转换的符号表为[0-9a-zA-Z],共61个字符,最大可表示62进制. 思路是原进制先转换为10进制,再转换到目标进制. 疑问: 对于负数,有小伙伴说可以直接将符号丢弃,按照整数进行进位转换,最后再将负号补回来,我认为这种做法是不对的. 正确的做法是:考虑好按照16位(short)还是32位(int)抑或64位(long long),先求出二进制补码(这时候就正负数就统一了),将二进制数转换为十进制后在转换为其他进制(如果有小伙伴知道如何直接将二进制转换为任意进制的方法可以留言告诉我,不胜

Noip2006 2^k进制数题解

题目描述 Description 设r是个2k进制数,并满足以下条件: (1)r至少是个2位的2k进制数. (2)作为2k进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后,则q的总位数不超过w. 在这里,正整数k(1≤k≤9)和w(k<W≤30000)是事先给定的. 问:满足上述条件的不同的r共有多少个? 我们再从另一角度作些解释:设S是长度为w的01字符串(即字符串S由w个"0"或"1"组成),S对应于上述条件(3)

P1066 2^k进制数

P1066 2^k进制数 204通过 373提交 题目提供者洛谷OnlineJudge 标签数论(数学相关)高精NOIp提高组2006 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 暂时没有讨论 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后,则q的总位数不超过w. 在这里,正整数k(1≤k≤9)和w(k<W< span>≤