进制转换,字符串读取算式

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值