• 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;
    }
    (~ ̄▽ ̄)~
  • 相关阅读:
    MatOfPoint作为minAreaRect的参数总是报错"throw new IllegalArgumentException("Incomatible Mat");
    !! Android developer 最新国内镜像
    下载安装和OpenCV匹配的Android开发环境
    Android View的onTouchEvent和OnTouch区别
    org.opencv.android.JavaCameraView 摄像机方向的问题
    C语言 · 数字三角形
    C语言 · Torry的困惑(基本型)
    C语言 · 高精度加法
    C语言 · Anagrams问题
    C语言 · 字符串对比
  • 原文地址:https://www.cnblogs.com/lcyhaha/p/7382992.html
Copyright © 2020-2023  润新知