[2016.7.Test1] T1 三进制异或

来源:互联网 发布:i淘宝网首页 编辑:程序博客网 时间:2024/05/19 00:10

三进制异或
(xor.c/pas/cpp limit 1s 128M)

【问题描述】

Leego 买到了一台不同寻常的计算机,它是三进制的!
在一番探索之下,Leego 发现了这个计算机的一个特性……它的异或(XOR)运算。
我们知道二进制的异或运算的结果就是把两个加数的二进制形式的每一位分别相加,不要进位,然后逐位模 2 得到的二进制数就是答案,如

12(1100) XOR 10(1010) = 6(0110) (括号里为二进制形式)
而这台三进制计算机的异或运算也是类似的:将加数的三进制形式的每一位分别相加,不要进位,然后逐位模 3 得到的三进制数就是答案。
比如,14(0112) XOR 50(1212) = 34(1021) (括号里为三进制式)

请你编一个程序:读入两个十进制数 A 和 C,输出最小的十进制整数 B,使得在 Leego 的三进制计算机中 A XOR B = C

【输入】

两个十进制整数,表示 A 和 C
【输出】
一个十进制整数 B
(ps:样例好像有错)
【输入输出样例 1】

14 50 34

【输入输出样例 2】
50 34 14

【数据说明】对于 30%的数据:A,C<=100

对于 70%的数据:A,C <=10000 对于 100%的数据,0<=A,C<=10^6

测试数据:
in1
62 10
out1
41
in2
98 8
180
in3
51 6
out3
63
in4
1247 8624
out4
7386
in5
1263 6830
out5
8564
in6
4289 514
out6
5336
in7
9306 88
out7
17863
in8
565419 592345
out8
105910
in9
863652 10000
out9
1530187
in10
761645 10
out10
1443836

AC代码:

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#define maxn 1000000using namespace std;int a,c;int bita[maxn],bitc[maxn];  int len;int bitb[maxn];typedef long long ll;void solve(){    for(int i=len;i>=1;i--)    {        for(int j=0;j<3;j++)        {            if((bita[i]+j)%3==bitc[i])            bitb[i]=min(bitb[i],j);        }    }    long long w = 1;    long long ans = 0;    for(int i=1;i<=len;i++)    {        ans += bitb[i]*w;        w*=3;    }    cout<<ans;}void work(){    int cnta = 0;    while(a)    {        bita[++cnta]=a%3;        a/=3;    }    int cntc = 0;    while(c)    {        bitc[++cntc]=c%3;        c/=3;    }    len = max(cnta,cntc);    for(int i=1;i<=len;i++)bitb[i]=9;    solve();}int main(){    #define FLOG    #ifdef FLOG    freopen("xor.in","r",stdin);    freopen("xor.out","w",stdout);    #endif    scanf("%d%d",&a,&c);    work();    return 0;}

计算A xor B
检验代码:

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#define maxn 1000000using namespace std;int a,b;int bita[maxn],bitb[maxn];  void work(){    int cnta = 0;    while(a)    {        bita[++cnta]=a%3;        a/=3;    }    int cntb = 0;    while(b)    {        bitb[++cntb]=b%3;        b/=3;    }    int len = max(cnta,cntb);    for(int i=1;i<=len;i++)    bita[i] = (bita[i]+bitb[i])%3;    long long w = 1;    long long ans = 0;    for(int i=1;i<=len;i++)    {        ans += bita[i]*w;        w*=3;    }    cout<<ans;}int main(){    #define FLOG    #ifdef FLOG    freopen("xorcheck.in","r",stdin);    freopen("xorcheck.out","w",stdout);    #endif    scanf("%d%d",&a,&b);    work();    return 0;}
1 0
原创粉丝点击