[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.