这道题理解题意很重要,首先对所有的字符三个三个进行转换,然后对于剩下的余数:如果余一个字符,就将这个字符转化为8位数二进制数,然后补16个0,取转换后的前两个字符,最后加两个=;如果余两个字符,就将这两个字符转换成8位数的二进制数,然后补8个0,取转换后的前三个字符,最后加一个=
数组大小最大开到10的6次方,10000也可以,再大就超内存了
输出的Case的那一行后面没有换行
代码如下:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char ch[1000000];
char ch1[1000000];
int s[1000000];
void f(char ch,int i)
{
while(ch)
{
if(ch>=128)
{
s[i*8+0]=1;
ch-=128;
}
else if(ch>=64)
{
s[i*8+1]=1;
ch-=64;
}
else if(ch>=32)
{
s[i*8+2]=1;
ch-=32;
}
else if(ch>=16)
{
s[i*8+3]=1;
ch-=16;
}
else if(ch>=8)
{
s[i*8+4]=1;
ch-=8;
}
else if(ch>=4)
{
s[i*8+5]=1;
ch-=4;
}
else if(ch>=2)
{
s[i*8+6]=1;
ch-=2;
}
else if(ch==1)
{
s[i*8+7]=1;
ch-=1;
}
}
}
int fun(int i)
{
int sum=0;
sum+=s[i*6+0]*32;
sum+=s[i*6+1]*16;
sum+=s[i*6+2]*8;
sum+=s[i*6+3]*4;
sum+=s[i*6+4]*2;
sum+=s[i*6+5];
return sum;
}
char e[200]= {"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"};
int main()
{
int t,cas;
int i,j,l;
int k,o,w;
scanf("%d",&t);
for(cas=1; cas<=t; cas++)
{
memset(ch,0,sizeof(ch));
scanf("%d%*c",&k);
scanf("%s",ch);
printf("Case #%d: ",cas);
for(l=0; l<k; l++)
{
memset(s,0,sizeof(s));
memset(ch1,0,sizeof(ch1));
o=strlen(ch)/3;
w=strlen(ch)%3;
for(i=0; i<o*3; i++)
{
f(ch[i],i);
}
for(i=0; i<o*4; i++)
{
ch1[i]=e[fun(i)];
}
if(w==2)
{
f(ch[o*3],o*3);
f(ch[o*3+1],o*3+1);
for(i=0; i<8; i++)
{
s[(o*3+2)*8+i]=0;
}
for(i=o*4; i<o*4+3; i++)
{
ch1[i]=e[fun(i)];
}
ch1[i]='=';
}
if(w==1)
{
f(ch[o*3],o*3);
for(i=0; i<16; i++)
{
s[24*o+8+i]=0;
}
for(i=o*4; i<o*4+2; i++)
{
ch1[i]=e[fun(i)];
}
ch1[i]='=';
ch1[i+1]='=';
}
int len=strlen(ch1);
for(i=0;i<len;i++)
{
ch[i]=ch1[i];
}
}
printf("%s\n",ch);
}
return 0;
}
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char ch[1000000];
char ch1[1000000];
int s[1000000];
void f(char ch,int i)
{
while(ch)
{
if(ch>=128)
{
s[i*8+0]=1;
ch-=128;
}
else if(ch>=64)
{
s[i*8+1]=1;
ch-=64;
}
else if(ch>=32)
{
s[i*8+2]=1;
ch-=32;
}
else if(ch>=16)
{
s[i*8+3]=1;
ch-=16;
}
else if(ch>=8)
{
s[i*8+4]=1;
ch-=8;
}
else if(ch>=4)
{
s[i*8+5]=1;
ch-=4;
}
else if(ch>=2)
{
s[i*8+6]=1;
ch-=2;
}
else if(ch==1)
{
s[i*8+7]=1;
ch-=1;
}
}
}
int fun(int i)
{
int sum=0;
sum+=s[i*6+0]*32;
sum+=s[i*6+1]*16;
sum+=s[i*6+2]*8;
sum+=s[i*6+3]*4;
sum+=s[i*6+4]*2;
sum+=s[i*6+5];
return sum;
}
char e[200]= {"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"};
int main()
{
int t,cas;
int i,j,l;
int k,o,w;
scanf("%d",&t);
for(cas=1; cas<=t; cas++)
{
memset(ch,0,sizeof(ch));
scanf("%d%*c",&k);
scanf("%s",ch);
printf("Case #%d: ",cas);
for(l=0; l<k; l++)
{
memset(s,0,sizeof(s));
memset(ch1,0,sizeof(ch1));
o=strlen(ch)/3;
w=strlen(ch)%3;
for(i=0; i<o*3; i++)
{
f(ch[i],i);
}
for(i=0; i<o*4; i++)
{
ch1[i]=e[fun(i)];
}
if(w==2)
{
f(ch[o*3],o*3);
f(ch[o*3+1],o*3+1);
for(i=0; i<8; i++)
{
s[(o*3+2)*8+i]=0;
}
for(i=o*4; i<o*4+3; i++)
{
ch1[i]=e[fun(i)];
}
ch1[i]='=';
}
if(w==1)
{
f(ch[o*3],o*3);
for(i=0; i<16; i++)
{
s[24*o+8+i]=0;
}
for(i=o*4; i<o*4+2; i++)
{
ch1[i]=e[fun(i)];
}
ch1[i]='=';
ch1[i+1]='=';
}
int len=strlen(ch1);
for(i=0;i<len;i++)
{
ch[i]=ch1[i];
}
}
printf("%s\n",ch);
}
return 0;
}
浙公网安备 33010602011771号