《编程思维与实践》1047.Base64编码

news/2025/2/14 6:13:17/

《编程思维与实践》1047.Base64编码

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

直接模拟:将每个Base64编码值都分为两部分:前半部分由上一个字符求得,后半部分由下一个字符求得.
特别地,如果字符为第一个或最后一个,则直接可以求得Base64编码.
如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中,% 2 n 2^n 2n表示取出后n位的二进制位,

这是因为 N % 2 n = ( 2 k + 2 k − 1 + . . . + 2 + 2 0 ) % 2 n = 2 n − 1 + . . . + 2 + 2 0 N\,\%\,2^n=(2^{k}+2^{k-1}+...+2+2^0)\,\%\,2^n=2^{n-1}+...+2+2^0 N%2n=(2k+2k1+...+2+20)%2n=2n1+...+2+20;
如果字符总数不为3的倍数,则需要添加’='对应的编码(不妨记为64),
之后只需要遍历字符串即可,每读三次更新一轮.

注意的点:

1.读取前半部分时指标不需要++,读取后半部分时才++,特别地,处于开头或者最后一个字符时,需要直接++;

2.需要补’=‘的情况只有非3的倍数的情况,由于读取编码前半部分时指标没有++,所以补’='时需要++;

代码

#include<stdio.h>
#include<string.h>char chart[66]={"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="};  //'='编码记为64int main()
{int T;scanf("%d",&T);for(int t=0;t<T;t++){char s[101];scanf("%s",s);char ans[300];  //answer 存Base64编码printf("case #%d:\n",t);int j=0,cnt=0;  //j为ans指标   cnt记录读几个字符for(int i=0;i<strlen(s);i++) {if(cnt==0) //处理每三个字符中的第一个{ans[j++]=s[i]>>2;      //第一个Base64 开头直接++ans[j]=(s[i]%4)<<4;    //第二个Base64的前半部分}else if(cnt==1) //处理第二个{ans[j++]+=s[i]>>4;   //第二个Base64的后半部分ans[j]=(s[i]%16)<<2;  //第三个Base64的前半部分  }else	//处理第三个{ans[j++]+=s[i]>>6;   //第三个Base64的后半部分 ans[j++]=s[i]%64;	//第四个Base64 最后一个也++ }cnt=(++cnt)%3;    //注意这里要先自增再模3 每3次cnt更新重置为0}if(cnt==1)   //剩一个字符{j++;    //因为只读前半部分没有++ 所以需要人为++ans[j++]=64;   //补两个'='ans[j++]=64;}else if(cnt==2)  //剩两个字符{j++;  //因为只读前半部分没有++ 所以需要人为++ans[j++]=64;}for(int i=0;i<j;i++){printf("%c",chart[ans[i]]);   //按编码输出对应的字符}printf("\n");}return 0;
}

http://www.ppmy.cn/news/59938.html

相关文章

Canny边缘检测算法

文章目录 前言1、Canny边缘检测算法2、代码1函数 3、代码24、基于tensor数据的代码 前言 最近在向卷积神经网络里的数据预处理和数据增强部分加这个函数&#xff0c;记录一下。 1、Canny边缘检测算法 Canny边缘检测算法是一种经典的边缘检测算法&#xff0c;其基本原理如下&a…

git标准使用

git标准使用 首先远程仓库一般只维护两个分支&#xff0c;master和develop。develop在master上创建。master只有项目管理人员才有编辑权限&#xff0c;保存每个正式投入生产环境的版本。 有开发需求的任务时&#xff0c;在dev分支上开feat分支(本地)。在feat分支上完成功能开发…

4 斐波那契数列

4 斐波那契数列 作者: Turbo时间限制: 1S章节: 递归 问题描述 : 斐波那契数列的排列是&#xff1a;0&#xff0c;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#xff0c;89&#xff0c;…

Kafka 消费者

一、消费者工作流程 1.1 总体工作流程 1.2 消费者组初始化流程 1.3 消费者组详细消费流程 二、消费者消费消息方式 ➢ pull&#xff08;拉&#xff09;模 式&#xff1a;consumer采用从broker中主动拉取数据。Kafka采用这种方式。 ➢ push&#xff08;推&#xff09;模式&am…

CommonJS规范

模块化 模块化解决的问题 代码的数量增多导致编写程序复杂度越来越高&#xff0c;此时如果依然将所有的代码编写到同一个文件中&#xff0c;代码就会变得非常难以维护&#xff0c;模块化就说解决这个问题的关键。什么是模块&#xff1f; 模块简单理解就是一个代码片段&#xf…

在一个真实的设备上调试Android应用

由于模拟器只包含很少的应用&#xff0c;可能只有一个处理某个动作的应用。为了更好地测试我们的应用&#xff0c;需要在一个真实的设备上运行这个应用。 可以按一下步骤在一个真实设备上运行你的应用。 1、启动设备上的USB调试选项 在你的安卓设备上&#xff0c;打开开发者选项…

JUC多并发编程 AQS

基础解释&#xff1a; 是用来实现锁或者其他同步器组件的公共基础部分的抽象实现,是重量级基础框架及整个JUC体系的基石&#xff0c;主要用于锁分配给“谁”的问题。整体就是一个抽象的 FIFO 队列来完成资源获取线程的排队工作&#xff0c;并通过一个 int 类变量表示持有锁的状…

【学习笔记】「JOISC 2022 Day4」复兴计划

先入为主给出结论&#xff1a;将 { X i } \{X_i\} {Xi​}离散化后&#xff0c;每条边的影响是一个区间。 然而我并没有想到可行的计算方法。 我真傻&#xff0c;真的。事实上 X i X_i Xi​变化的本质是边的加入顺序的变化。不妨考虑左端点的情形&#xff0c;首先将边按大小排…