p1103【base64编码】

  背景 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;
}
(~ ̄▽ ̄)~

 

posted @ 2017-08-17 17:28  列車員lcy  阅读(312)  评论(0编辑  收藏  举报