HDU5237 - Base64

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值