背景 Background
悲剧的小金鱼儿 在写某程序时用到了这玩意儿。于是将这道题整理出来,仅供大家娱乐……
提高本题通过率的重任就交给你了#_#
描述 Description
Base64编码是一种被广泛使用的编码方案。迅雷不及掩耳盗铃儿响叮当的专用链接所使用的加密方案就是Base64编码。
Base64编码规则:
Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。
转换的时候,将3个字节(2^3=8)的数据,先后放入一个缓冲区中,先来的字节占高位。数据不足3字节的话,剩下的字节用0补足(具体看注释),
然后每次取出6个字节(因为 2^6=64),按照其值选择下表中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
如果最后剩下一个输入数据,编码结果后加2个“=”;如果最后剩下一个以上输入数据,在编码结果后加1个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
Base64编码字符表索引
0 A | 16 Q | 32 g | 48 w
1 B | 17 R | 33 h | 49 x
2 C | 18 S | 34 i | 50 y
3 D | 19 T | 35 j | 51 z
4 E | 20 U | 36 k | 52 0
5 F | 21 V | 37 l | 53 1
6 G | 22 W | 38 m | 54 2
7 H | 23 X | 39 n | 55 3
8 I | 24 Y | 40 o | 56 4
9 J | 25 Z | 41 p | 57 5
10 K | 26 a | 42 q | 58 6
11 L | 27 b | 43 r | 59 7
12 M | 28 c | 44 s | 60 8
13 N | 29 d | 45 t | 61 9
14 O | 30 e | 46 u | 62 +
15 P | 31 f | 47 v | 63 /
你的任务是,按照Base64编码规则和编码字符表,将给出的文字转换成Base64编码后输出。
输入格式 Input Format
一行,编码前的字符
输出格式 Output Format
一行,Base64 编码后的字符
样例输入 Sample Input
===== 样例1 =====
Fuck
===== 样例2 =====
No zuo no die
样例输出 Sample Output
===== 样例1 =====
RnVjaw=
===== 样例2 =====
Tm8genVvIG5vIGRpZSA=
时间限制 Time Limitation
本题时间限制未知,但我可以告诉你数据都有什么
其中4个数据:
圆周率小数点后10001位
ChinaDaily上的一段新闻
莎士比亚的一句名言
本题代码
其余略
注释 Hint
=====样例一 解释=====
文本 F u c k
ASCII编码 70 117 99 107
二进制位 01000110011101010110001101101011
Base64识别 010001 100111 010101 100011 011010 110000 补了4个零
索引 17 39 21 35 26 48 =
Base64编码 R n V j a w
=====样例二 解释=====
我知道你已经懂了^_^
注:注意对读入数据中空格的处理(翻书),别忘了静态查错~
来源 Source
小金鱼儿
创建于 2012年12月22日
飞不高的纸飞机
修改于 2014年8月26
虽说这道题比较水,但是确实还是有写的价值的,写这个题又了解了一些东西
思路:就是一个模拟照着题目搞就能A了。
先列一下学到的东西吧:
(1):读入一个带空格的字符串:
string s;
getline(cin,s);
(2):字符串和int的转换(哇,这个已经用到很多次了哇)
头文件:#include<sstream>
字符串转int:
stringstream ss;
ss<<t;
int p;
ss>>p;
int转字符串:
int t=10;
stringstream ss;
ss<<t;
string s1 = ss.str();
(3)函数pow
计算x的y次方,pow(x,y);
但x,好像要是double的。
所以二进制转十进制就可以这样写了:
void Work(int x)
{
int b=0,k=0,m;
while(x!=0)
{
m=x%10;
x/=10;
b+=m*pow(2.0,k++);
}
}
虽说是一个暴力题,但确实还是能学到很多东西的;
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<sstream> using namespace std; string s1; char ans[1100]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9','+','/'};//直接打表多舒服 void work(int x)//10进制转2进制 { while(x!=0) { int h=x&((1<<1)-1); if(h==0) s1+="0"; else s1+="1"; x=x>>1; } } string str; int a[11000]; int len=0; void Work(int x)//二进制转10进制 { int b=0,k=0,m; while(x!=0) { m=x%10; x/=10; b+=m*pow(2.0,k++); } len++; a[len]=b; } int main() { string s; getline(cin,s); //freopen("add.out","w",stdout); for(int i=0;i<s.size();i++) { char h=s[i]; int q=h; s1=""; work(q); if(s1.size()<8)//补零 { int l=8-s1.size(); for(int i=1;i<=l;i++) s1+="0"; } reverse(s1.begin(),s1.end());//颠倒 str+=s1; //cout<<s1<<endl; } int sum=0; string t=""; for(int i=0;i<str.size();i++) { sum++; t+=str[i]; if(sum%6==0)//字符串转int { stringstream ss; ss<<t; int p; ss>>p; //cout<<p<<endl; Work(p); t=""; sum=0; } } int u=0; if(sum==1) { for(int i=1;i<=6-sum;i++) { t+="0"; } stringstream ss; ss<<t; int p; ss>>p; //cout<<p<<endl; Work(p); u=2; } if(sum>1) { for(int i=1;i<=6-sum;i++) { t+="0"; } stringstream ss; ss<<t; int p; ss>>p; //cout<<p<<endl; Work(p); u=1; } for(int i=1;i<=len;i++) cout<<ans[a[i]]; if(u==1) cout<<"="; if(u==2) cout<<"=="; cout<<endl; return 0; }