2020JMU天梯进制转换
题目链接pta
输入直接用字符串读取,将加减乘除符号作为数字间断的标志。
思路:先当成十进制存储,但后面使用仍然是当作其他进制,总需要一个存储的进制格式,目的是方便后面的读取,不喜欢字母 注意因为有字母会超过十,所以开一个int的数组,一格存一整个个数字,如AA,存的是10 10的格式。
任意进制转换十进制进制代码:
ll tran(int* num, int jin)
{
ll ans = 0;
int cnt = 0;
while (num[cnt] != -1)
{
ans *= jin;
ans += num[cnt++];
}
return ans;
}
PS:额外存出这个算式中最大的单个数字,从当前数字+1的进制开始,比如出现A就至少是11进制,否则进制转换的时候会出现问题。
总的代码:
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define ll long long
int a[3][1000];
char ch1;
int maxn;
int read()
{
maxn = -1;
char ch[1000];
if (scanf(" %s", ch) == EOF)return 0;
int len;
len = strlen(ch);
int cnt = 0;
int i = 0;
for (; ch[i] != '+' && ch[i] != '-' && ch[i] != '*' && ch[i] != '/'; i++)
{
if (ch[i] >= 'A')a[0][cnt++] = ch[i] - 'A' + 10;
else a[0][cnt++] = ch[i] - '0';
maxn = max(maxn, a[0][cnt - 1]);
}
ch1 = ch[i++];
a[0][cnt] = -1;
cnt = 0;
for (; ch[i] != '='; i++)
{
if (ch[i] >= 'A')a[1][cnt++] = ch[i] - 'A' + 10;
else a[1][cnt++] = ch[i] - '0';
maxn = max(maxn, a[1][cnt - 1]);
}
a[1][cnt] = -1;
cnt = 0;
i++;
for (; i < len; i++)
{
if (ch[i] >= 'A')a[2][cnt++] = ch[i] - 'A' + 10;
else a[2][cnt++] = ch[i] - '0';
maxn = max(maxn, a[2][cnt - 1]);
}
a[2][cnt] = -1;
return 1;
}
ll tran(int* num, int jin)
{
ll ans = 0;
int cnt = 0;
while (num[cnt] != -1)
{
ans *= jin;
ans += num[cnt++];
}
return ans;
}
int main()
{
while (read())
{
ll x, y, z;
int flag = 0;
for (int i = max(2,maxn+1); i <= 16; i++)
{
x = tran(a[0], i);
y = tran(a[1], i);
z = tran(a[2], i);
if (ch1 == '+')
{
if (x + y == z)
{
cout << i << endl;
flag = 1;
break;
}
}
else if (ch1 == '-')
{
if (x - y == z)
{
cout << i << endl;
flag = 1;
break;
}
}
else if (ch1 == '*')
{
if (x * y == z)
{
cout << i << endl;
flag = 1;
break;
}
}
else
{
if (x / y == z && x % y == 0)
{
cout << i << endl;
flag = 1;
break;
}
}
}
if (!flag)cout << -1 << endl;
}
return 0;
}