P6353 [COCI2007-2008#3] OKTALNI 题解

[COCI2007-2008#3] OKTALNI
蒟蒻的第一篇题解。

首先题目已经告诉了我们转换方式。

如果二进制的数字的位数不能被三整除,则在左侧补 \(0\) 直到数字位数是 \(3\) 的倍数。
将这个二进制数每三位分成一组。
每组的二进制可用如下表格所示的数字替换。
如果不知道的请看解释:
对于任何一个八进制,我们可以人为补 \(0\) ,把它变成伪二进制。如八进制数 \(314314\) 可以假装变成二进制 \(003001004003001004\) ,但是需要进位,所以把 \(003003\) 变成 \(011011\) ,把 \(004004\) 变成 \(100100\) ,那么原数就变成了二进制数 \(011001100011001100\) ,删去前导 \(0\) ,就是 \(11001100011001100\) 。反之亦然。 那么这道题就变成了字符串操作。

#include<iostream>
#include<cstring>
#include<cstdio>//头文件
using namespace std;
int a[101],b[101],la,lb=0;
char aa[101];
int main()
{
    int i,j,k;

    scanf("%s",aa);//读入,注意luogu的gets是Linux的。
    la=strlen(aa);//获得输入长度。
    for(i=1;i<=la+1;i++)
    {
        a[i]=aa[la-i]-'0';
    }//把整个字符串倒序,方便在开头补0。
    if(la%3==1)
    {
        a[la+1]=0;
        a[la+2]=0;
        la+=2;
    }
    if(la%3==2)
    {
        a[la+1]=0;
        la+=1;
    }//在整个字符串开头(现在的结尾)补0,使字符串的长度为3的倍数。
    for(i=3;i<=la;i+=3)
    {
        swap(a[i],a[i-2]);//交换,使顺序符合正常。
        lb++;
        b[lb]=a[i-2]*4+a[i-1]*2+a[i];//把答案压入栈,最后倒序输出。
    }
    for(i=lb;i>=1;i--)cout<<b[i];//输出各个数。

    return 0;
}

end.

上一篇:sql server存储和搜索非结构化数据


下一篇:iOS中为什么使用__weak和__strong可以解决block的循环引用?