【kAriOJ】离散数学春季学期编程测试 1
A。凯撒密码
题意:
给你k1,k2,和一串明文,一串密文。
明文用k1加密,密文用k2解密。
对于明文要把字母转换成大写字母,非字母全部删除。
额:要考虑到取模可能会变成负数,所以要加一下26再取模。
代码:
#include<stdio.h>
#define N 85
int k1, k2;
char plain[N], cipher[N];
void init(char s[]) //预处理,转换为大写字母
{
int i;
for(i = ; s[i]; i++)
if(s[i] >= 'a' && s[i] <= 'z')
s[i] = s[i] - 'a' + 'A';
}
void encrypt(char s[],int k,int f)//加解密
{
init(s);
int i;
for(i = ; s[i]; i++)
if(s[i] >= 'A' && s[i] <= 'Z')
printf("%c", ((s[i] - 'A' + k*f + ) % + 'A'));
printf("\n");
}
int main()
{
scanf("%d,%d ", &k1, &k2);
gets(plain);
gets(cipher);
encrypt(plain,k1,);
encrypt(cipher,k2,-);
return ;
}
B。RSA加密
题意:
给你n,e,和一串明文。用(n,e)加密明文。将明文字母转换成数字,按8位数字分段,不足部分补足0。明文中有非字母删除,A和a转成数字都是00, Z和z转成数字都是25。明文数字8位分段的每一段对应的密文也要求是8位,如果不足8位,前面补足0。
对于明文要把字母转换成大写字母,非字母全部删除。
补充:
RSA加密就是字母转化为两位数字,分段处理,比如每八个一段,M为明文数字段,C为密文数字段,C=Me%n。
代码:
#include<stdio.h>
#include<string.h>
#define N 1000
#define ll long long
ll n, e;
char plain[N];
ll qpow(ll a, ll b)//快速幂
{
ll k = a % n;
ll ans = ;
while(b)
{
if(b & )
ans = (ans * k ) % n;
k = ( k * k) % n;
b >>= ;
}
return ans;
}
void init(char s[]) //预处理,转换为大写字母
{
int i;
for(i = ; s[i]; i++)
if(s[i] >= 'a' && s[i] <= 'z')
s[i] = s[i] - 'a' + 'A';
}
void encrypt(char s[]) //加密
{
init(s);
int k = ,i;
ll block = ;
for(i = ; s[i]; i++)
if(s[i] >= 'A' && s[i] <= 'Z') //如果是字母
{
block = block * + (s[i] - 'A') ; //明文对应的数字串
k++;
if(k == ) //够8位数字时
{
printf("%08lld", qpow(block, e) % );//输出密文,这个模不知道是不是必须的,题目没说n的上限
block = ;
k = ;
}
}
if(k)//剩下的明文要后面补零
{
while(k != )
{
block = block * ;
k++;
}
printf("%08lld", qpow(block, e) % );
}
}
int main()
{
// freopen("in.txt", "r", stdin);
scanf("%lld%lld ", &n, &e);
gets(plain);
encrypt(plain);
return ;
}
C。RSA解密
题意:
给你n,e,和一串明文。用(n,e)加密明文。将明文字母转换成数字,按8位数字分段,不足部分补足0。明文中有非字母删除,A和a转成数字都是00, Z和z转成数字都是25。明文数字8位分段的每一段对应的密文也要求是8位,如果不足8位,前面补足0。
对于明文要把字母转换成大写字母,非字母全部删除。
补充:
RSA加密就是字母转化为两位数字,分段处理,比如每八个一段,M为明文数字段,C为密文数字段,C=Me%n。
代码:
#include<stdio.h>
#include<string.h>
#define N 802
#define ll long long
ll n, e, p, q, d, x, y;
char cipher[N << ], plain[];
ll exgcd(ll a, ll b)//扩展欧几里德求逆元
{
if(b == )
{
x = ;
y = ;
return a;
}
ll r = exgcd(b, a % b);
ll tmp = x;
x = y;
y = tmp - a / b * y;
return r;
}
ll qpow(ll a, ll b)//快速幂
{
ll k = a % n;
ll ans = ;
while(b)
{
if(b & )
ans = (ans * k ) % n;
k = ( k * k) % n;
b >>= ;
}
return ans;
}
void init()//求p和q,和d
{
int i;
for(i = ; i < n; i++)
if(n % i == )
{
p = i;
q = n / i;
break;
}
ll M;
M = (p - ) * (q - );
exgcd(e, M);
d = (x % M + M) % M;//求e的逆元d
}
void decrypt() //解密
{
ll block = ;
int k = , i, j;
for(i = ; cipher[i]; i++)
{
block = block * + cipher[i] - '';//密文从字符串中取出来
k++;
if(k == )//密文达到8位数字时
{
memset(plain, , sizeof plain);//清空明文字符串
block = qpow(block, d);//计算明文数字串
for(j = ; j >= ; j--)//每次计算两位数字并存在明文字符串中,因为从后面往前取,所以倒过来存
{
plain[j] = block % + 'A';//取最后面两个数字
block /= ;//去掉最后面两个数字
}
printf("%s", plain);//输出明文
k = ;//清空计数器
}
}
}
int main()
{
// freopen("in.txt", "r", stdin);
scanf("%lld%lld ", &n, &e);
gets(cipher);
init();
printf("%d\n", d);
decrypt();
return ;
}
【kAriOJ】离散数学春季学期编程测试 1的更多相关文章
- 百度前端技术学院(IFE)2016春季学期总结
今天(5月16日)作为第八个提交者提交了任务五十:RIA微型问卷管理平台 这样一个综合性的大任务,宣告我的IFE春季学期课程学习顺利完成.其实任务五十并不复杂,现在再让我来做,可能一周不到就写出来了, ...
- 2019年春季学期第四周作业Compile Summarize
这个作业属于哪个课程 C语言程序设计一 这个作业要求在哪里 2019春季学期第四周作业 我的课程目标 重新学习有关数组的问题 这个作业在哪个具体方面帮助我实现目标 对于置换有了新的见解 参考文献 中国 ...
- 2019年春季学期《C语言程序设计II》助教注意事项
本学期<C语言程序设计II>课程安排 理论课时24(1-12周),实验课时8(13周),课程设计课时16(14-15周) 理论课教学内容 附:教学进度表 本学期实验课和课程设计参考教材 & ...
- 2019年春季学期《C语言程序设计II》课程总结
2019年春季学期<C语言程序设计II>课程总结 1.课程情况 教学内容 课堂小结 作业安排 优秀作业 备注 1.开学谈心 2.测验数据类型.运算符与表达式的自学情况,并讲解测验题目3.第 ...
- C#串口编程测试收发
原文:http://www.cnblogs.com/vsdot/archive/2013/04/23/3263348.html 基本传递方法:RS232传输要有1位起始位,8位数据位.1位校验位( ...
- shell脚本编程测试类型下
一bash的数值测试 -v VAR变量VAR是否设置 数值测试:-gt 是否大于greater-ge 是否大于等于-eq 是否等于-ne 是否不等于 not equal-lt 是否小于-le 是否小 ...
- Task 异步编程测试案例及基础应用说明
对于多线程,我们经常使用的是Thread.在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于“任务的编程模型”所冲击,因为tas ...
- USTC《现代软件工程》春季学期——第一次个人作业:词频统计
截止日期 2018年3月29日23:59 要求 1. 对源文件(*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等,文件夹内的所有文件)统计字符数. ...
- vertx异步编程测试
vertx是异步编程的框架,性能较高,开发简单.异步编程就是当一个请求来了,vertx将其交由一个事件进行处理,然后继续向下执行,等处理完成,返回结果,通知客户端.这是一个由服务端反向调用客户端的过程 ...
随机推荐
- 使用Android Studio搭建Android集成开发环境(图文教程)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 更改QTP默认测试脚本路径
QTP的默认测试脚本路径为安装路径下的Tests文件夹下, 如果你安装在D:,那么默认脚本路径为D:\Program Files\HP\QuickTest Professional\Tests 但是因 ...
- 性能测试一般过程与LR性能测试过程
性能测试作为测试分类的一个大类,等同于系统测试中的功能测试.安全性测试和配置测试等,因此她的测试过程是对整个测试类型中测试过程的一个描述,因此包含了测试需要的确认目标,熟悉系统.获得需求等部分,因此性 ...
- UltraISO制作U盘启动盘安装Win7/10系统攻略
UltraISO制作U盘启动盘安装Win7/9/10系统攻略 U盘安装好处就是不用使用笨拙的光盘,光盘还容易出现问题,无法读取的问题.U盘体积小,携带方便,随时都可以制作系统启动盘. U盘建议选择8G ...
- Linux下如何知道文件被那个进程写
http://blog.yufeng.info/archives/2581#more-2581
- mysql高可用方案总结性说明
MySQL的各种高可用方案,大多是基于以下几种基础来部署的(也可参考:Mysql优化系列(0)--总结性梳理 该文后面有提到)1)基于主从复制:2)基于Galera协议(PXC):3)基于NDB引 ...
- homepage左边的导航菜单怎么做的?
homepage左边的导航菜单怎么做的? 为啥只在homepage页面写了一个div 然后用一个homepage.js来填充这个div 然后用一个外部容器ID作为homepage.js的参数
- nodejs 针对 mysql 设计的原型库,支持事务/共享多次/单次查询
//通过this访问内置流程对象, 在每个流程中都能使用 //this.conn => mysql-connection //this.results => 整个流程数已经返回的值 //t ...
- bootstrap modal的data-dismiss属性
<button type="button" class="btn default" data-dismiss="modal">关 ...
- Spring4 MVC文件下载实例
这篇文章将向您展示如何使用Spring MVC4执行文件下载,我们将看到应用程序从文件系统内部以及外部文件下载文件. 本教程的主要亮点: 下载文件是相当简单的,涉及以下步骤. 创建一个InputStr ...