3138. Base64编码

10175102262 LarsPendragon

个人觉得OJ应该管控一下不当言论(这题还是很正常的,怎么就骂上了)。思路:按照输入的字符串每三个处理一次,最后结算是否满足4的倍数个输出,不满4的倍数个就输出“=”。附C代码:

#include <stdio.h>
#include <string.h>
int main()
{
    int T, I;
    scanf("%d",&T);
    for(I=0; I<T; I++)
    {
        char s[100];
        int i, n, cnt, ans[140]={0}, j;//将计算的结果存入ans数组中
        scanf("%s",s);
        int l=strlen(s);
        for(i=0, cnt=0, j=0; i<l; i++)
        {
            if(cnt==0) //处理每三个字符中的第一个
            {
                ans[j++]=s[i]/4;
                ans[j]=(s[i]%4)*16;
            }
            else if(cnt==1)//处理第二个
            {
                ans[j++]+=s[i]/16;
                ans[j]=(s[i]%16)*4;
            }
            else//处理第三个
            {
                ans[j++]+=s[i]/64;
                ans[j++]=s[i]%64;
            }
            cnt=(++cnt)%3;//注意这里要先自增再模3
        }
        if(j%4) for(j++; j%4!=0; j++) ans[j]=64;//补齐4的倍数个输出
        printf("case #%d:\n",I);
        for(i=0; i<j; i++)//处理输出
        {
            if(ans[i]<26) printf("%c",'A'+ans[i]);
            else if(ans[i]<52) printf("%c",'a'+ans[i]-26);
            else if(ans[i]<62) printf("%c",'0'+ans[i]-52);
            else if(ans[i]==62) printf("+");
            else if(ans[i]==63) printf("/");
            else printf("=");
        }
        printf("\n");
    }
    return 0;
}
Master X

骂就不至于了吧……样例其实暗示你了要是4的倍数啊……debug也可以出来啊……
OJ题目不说清楚不是很正常的一件事吗………………

Li Dao

是,转换后字符数不是4的倍数就要输出=,凑满4的倍数(附AC代码)
不是不满4个字符

include

using namespace std;
int T;
string line;
vector V;

void add(char aa)
{
for(int i=8;i>=1;i–)
if(aa&(1<<(i-1))) V.push_back(1);
else V.push_back(0);
return;
}
char dic(int aa)
{
if(aa<=25) return ‘A’+aa;
else if(aa<=51) return ‘a’+aa-26;
else if(aa<=61) return ‘0’+aa-52;
else if(aa==62) return ‘+’;
else return ‘/’;
}
void print(int aa)
{
int num=0,weight=1;
for(int i=5;i>=0;i–)
{
if(V[aa+i]) num+=weight;
weight*=2;
}
printf(“%c”,dic(num));
return;
}
void solve()
{
cin>>line;
V.clear();

int ll=line.length();
for(int i=0;i<ll;i++) add(line[i]);
while(V.size()%6!=0) V.push_back(0);

int cnt=0;
int pos=0;
while(pos<V.size())
{
print(pos);
pos+=6;
cnt++;
}
while(cnt%4!=0) {cout<<”=”;cnt++;}
cout<<endl;
return;
}

int main()
{
scanf(“%d”,&T);
for(int step=0;step<T;step++)
{
printf(“case #%d:\n”,step);
solve();
}
return 0;
}

10152130230

这题他妈的傻吊
日你妈

Hairaa
//AC代码
#include <iostream>
#include <string>

using namespace std;

int main()
{
    int i, j, k, n, Sample[6] = {32,16,8,4,2,1};//Sample保存转换成Base64码时对应数值
    cin >> n;
    for (i = 0;i < n;i++)
    {
        int ascii[105 * 8] = {};//读取新字符串前刷新
        string s;
        cin >> s;
        cout << "case #" << i << ":" << endl;
        for (j = 0;j < s.size();j++)
        {
            int m = int(s[j]);
            k = 7;
            while(m)
            {
                ascii[j*8+k] = m % 2;
                m = m / 2;
                k--;
            }
        }
        int BaseNum = s.size() * 8;//表示Base64码中位数
        while (BaseNum % 6 != 0) { BaseNum++; }//使其成为6的倍数
        for (j = 0;j < BaseNum / 6;j++)
        {
            int sum = 0;//记录Base64码值每6位刷新一次
            for (int q = 0;q < 6;q++)//每6位计算一次sum值
            {
                sum += ascii[j * 6 + q] * Sample[q];
            }
            if (sum <= 25 && sum >= 0) { cout << char(sum + 65); }
            else if (sum >= 26 && sum <= 51) { cout << char(sum + 71); }
            else if (sum >= 52 && sum <= 61) { cout << char(sum - 4); }
            else if (sum == 62) { cout << '+'; }
            else if (sum == 63) { cout << '/'; }
        }
        while (j % 4 != 0) { cout << '=';j++; }//不满4的倍数个字符时用'='补位
        cout << endl;
    }
}
你当前正在回复 博客/题目
存在问题!