#include <stdio.h>
#include <string.h>
#include <math.h>
int n;
int supply(int l,int a[10][1000],int p)
{
int i;
for(i=1;i<=4;i++)
if(pow(2,i)==l)
break;
int j;
int k=a[p][0];
if(k%i!=0)
{
j=k%i;
a[p][0]=k+i-j;
for(j;j<i;j++)
{
a[p][k+i-j]=0;
}
}
return 0;
}
int trans(int a[10][1000],int p)
{
int t,k=a[p][0],i;
for(i=1;i<=k/2;i++)
{
t=a[p][i];
a[p][i]=a[p][k-i+1];
a[p][k-i+1]=t;
}
return 0;
}
int sixteenchang(char a[10][100])
{
int i,j,ten[10][100];
for(i=0;i<n;i++)
for(j=0;j<strlen(a[i]);j++)
{
if(a[i][j]<'A')
ten[i][j]=a[i][j]-'0';
else ten[i][j]=a[i][j]-'A'+10;
}
int two[10][1000],k;
for(i=0;i<n;i++)
{
k=1;
two[i][0]=0;
for(j=strlen(a[i])-1;j>=0;j--)
for(;;)
{
two[i][k]=ten[i][j]%2;
two[i][0]++;
if(ten[i][j]/2==0)
{
if(two[i][0]%4!=0)
{
supply(16,two,i);
}
k=two[i][0]+1;
break;
}
k++;
ten[i][j]=ten[i][j]/2;
}
supply(8,two,i);
trans(two,i);
}
eightchange(two);
return 0;
}
int eightchange(int a[10][1000])
{
int i,j,eight[10][1000],sum;
int l=1,z;
for(z=0;z<n;z++)
{
l=1;
int k=a[z][0];
for(i=1;i<=k;i=i+3)
{
sum=0;
for(j=2;j>=0;j--)
{
if(a[z][i+j]==1)sum=sum+pow(2,2-j);
}
eight[z][0]++;
eight[z][l]=sum;
l++;
}
}
for(i=0;i<n;i++)
{
if(eight[i][1]==0)
{
for(z=1;z<=eight[i][0];z++)
eight[i][z]=eight[i][z+1];
eight[i][0]--;
}
for(j=1;j<=eight[i][0];j++)
printf("%d",eight[i][j]);
printf("\n");
}
return 0;
}
int main()
{
int i;
char a[10][100];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%s",&a[i]);
sixteenchang(a);
return 0;
}
蓝桥杯 十六进制转八进制
于 2022-03-18 11:54:08 首次发布