另类的异或
描述
对于普通的异或,其实是二进制的无进位的加法
这里我们定义一种另类的异或A op B, op是一个仅由^组成的字符串,如果op中包含n个^,那么A op B表示A和B之间进行n+1进制的无进位的加法。
下图展示了3 ^ 5 和 4 ^^ 5的计算过程
输入
第一行有一个正整数T, 表示下面共有T组测试数据。
接下来T行,每行有一组测试数据,是由空格隔开的三个部分组成:
A B C
A和C是两个十进制整数,B是一个字符串,由n个^组成
1 <= T <= 100, 0<=A,B<2^30, 1<=n<=1000
输出
每个测试数据输出一行,包含一个数字,即该数据的结果,用十进制表示。
样例输入
样例输出
这里我们定义一种另类的异或A op B, op是一个仅由^组成的字符串,如果op中包含n个^,那么A op B表示A和B之间进行n+1进制的无进位的加法。
下图展示了3 ^ 5 和 4 ^^ 5的计算过程
接下来T行,每行有一组测试数据,是由空格隔开的三个部分组成:
A B C
A和C是两个十进制整数,B是一个字符串,由n个^组成
1 <= T <= 100, 0<=A,B<2^30, 1<=n<=1000
2 3 ^ 5 4 ^^ 5
6 6
按照题意就可以写出代码:
#include"iostream"
#include"stdio.h"
#include "stack"
#include"math.h"
using namespace std;
int main()
{
int a;
char *b = new char[100];
char *cbk=b;
int c;
int k=0;
cin>>a;
cin>>b;
while(*b=='^')
{
++k;b++;
}
cin>>c;
int k1=k+1;
k=0;
stack<int> st1;
stack<int> st2;
int a1=0;
while(a!=0)
{
++a1;
st1.push(a%(k1));
a=a/k1;
}
int mm=0;
int a2=0;
while(c!=0)
{
++a2;
st2.push(c%(k1));
c=c/k1;
}
if(a1>=a2)
{
for(k=0;k<a1-a2;k++)
st2.push(0);//这里是让两个栈中的元素个数是一样多的,这样才能进行十进制的转化
mm=a1;//记录转换成某进制数的位数
}
if (a2>=a1)
{
for(k=0;k<a2-a1;k++)
st1.push(0);//这里是让两个栈中的元素个数是一样多的,这样才能进行十进制的转化
mm=a2;
}
int sum=0;
while(!st2.empty()||!st2.empty())
{
cout<<"st1: "<<st1.top()<<endl;
cout<<"st2: "<<st2.top()<<endl;
if((st1.top()+st2.top())>=(k1))
{
sum+=0;
}
else
{
sum+=(st1.top()+st2.top())*pow(k1,--mm);
}
st1.pop();
st2.pop();
}
cout<<sum<<endl;
return 0;
}