一道比较显而易见的模拟题,相对而言字符串处理对我更难一些。。
有点像之前某校校赛现场做的一道题,完成MD5的解密过程
只需要实现将原字符串每三字节24位重新切分为4个6位,然后从表里转换为对应的BASE64码即可,不足三字节的用0补满至下一个6位(即剩一个字节补4个0补成12位,剩下两个字节补2个0补成18位),然后用'='补齐剩下的空位即可。
代码:(对字符串的处理很丑。。。见谅)
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
char S[1000],Q[1000];
char Std[65]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
void Make(int x)
{
Q[strlen(Q)]=Std[x];
}
void f(int n) //以二进制方式输出整数n
{
if(n) f(n/2);
else return;
printf("%d",n%2);
}
int main()
{
int t,tm;
scanf("%d",&tm);t=tm;
while(t--)
{
int k,i,n;
scanf("%d %s",&n,S);
while(n--)
{
memset(Q,0,sizeof(Q));
int l=strlen(S);
for(i=0;i<l;i++)
{
if(i%3==0)
Make(S[i]/4);
if(i%3==1)
Make((S[i-1]%4)*16+S[i]/16);
if(i%3==2)
{
Make((S[i-1]%16)*4+S[i]/64);
Make(S[i]%64);
}
}
if(l%3)
{
int key=(S[l-1]%4)*16;
if(l%3==2) key=(S[l-1]%16)*4;
Make(key);
strcat(Q,"=");
if(l%3==1) strcat(Q,"=");
}
Q[strlen(Q)]='\0';
strcpy(S,Q);
}
printf("Case #%d: %s\n",tm-t,S);
}
return 0;
}