[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;
}