【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将其交由一个事件进行处理,然后继续向下执行,等处理完成,返回结果,通知客户端.这是一个由服务端反向调用客户端的过程 ...
随机推荐
- 2016"百度之星"-资格赛
//本题要求:(Ar*A2...An)%p,亦即[(A1*A2*...An)/(A1*A2*...Ar-1)]%p,由于A1*A2...An乘积过大,无法求得相除所得的结果 //我们需要用到乘法逆元( ...
- 使用 ssh 连接github的方法说明(gitub的官方说法)
https://help.github.com/articles/generating-an-ssh-key/
- python案例-用户登录
要求: •输入用户名密码 •认证成功后显示欢迎信息 •输错三次后锁定 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 "" ...
- .Net core环境准备
.Net core 出来有段日子了,在跨平台上迈出了坚实的一步,尽管如此身边还是有很多人都转向了Java阵营.抛开语言之争,在.net平台上工作多年,还是有必要了解下新推出的技术,没准有朝一日就用上了 ...
- 15Spring_AOP编程(AspectJ)_抛出通知
- flask 使用 SQLAlchemy 的两种方式
1. 使用 flask-SQLAlchemy 扩展 # flask-ext-sqlalchemy.py from flask import Flask from flask.ext.sqlalchem ...
- sqlalchemy 的 ORM 与 Core 混合方式使用示例
知乎: sqlalchemy 的 ORM 与 Core 混合方式操作数据库是一种怎样的体验? 答: 酸! 本文基于:win 10 + python 3.4 + sqlalchemy 1.0.13 基本 ...
- JS clientHeight,scrollHeight,offsetHeight,scrollTop,offsetTop概念
JS滚动页面到某一位置时触发指定事件能够增强用户体验或是提高性能,其中使用最多的场景是加载更多,当鼠标滚动至页面下方时,自动加载下一页的内容.另一个常用的场景是当用户滚动至页面某一地方时,页面会给出提 ...
- openMP的一点使用经验【非原创】
按照百科上说的,针对于openmp的编程,最简单的就是在开头加个#include<omp.h>,然后在后面的for上加一行#pragma omp parallel for即可,下面的是较为 ...
- memcached 适用的场景
最近在看 memcached 的公共课,发现memcache的确是个好东西,可以显著地减小数据库负载,当然我们要搞清楚,任何一样技术都有它的优缺点, 在使用它的时候,搞清楚它的适用场景,才能扬长避短 ...