HDU5237- Base64

来源:互联网 发布:java主方法入口 编辑:程序博客网 时间:2024/06/12 00:13

一道比较显而易见的模拟题,相对而言字符串处理对我更难一些。。

有点像之前某校校赛现场做的一道题,完成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;}


0 0
原创粉丝点击