【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 = 0; 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 = 0; s[i]; i++)
        if(s[i] >= ‘A‘ && s[i] <= ‘Z‘)
            printf("%c", ((s[i] - ‘A‘ + k*f + 26) % 26  + ‘A‘));
    printf("\n");
}
int main()
{
    scanf("%d,%d ", &k1, &k2);
    gets(plain);
    gets(cipher);
    encrypt(plain,k1,1);
    encrypt(cipher,k2,-1);
    return 0;
}

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 = 1;
    while(b)
    {
        if(b & 1)
            ans = (ans * k ) % n;
        k = ( k * k) % n;
        b >>= 1;
    }
    return ans;
}
void init(char s[]) //预处理,转换为大写字母
{
    int i;
    for(i = 0; s[i]; i++)
        if(s[i] >= ‘a‘ && s[i] <= ‘z‘)
            s[i] = s[i] - ‘a‘ + ‘A‘;
}
void encrypt(char s[]) //加密
{
    init(s);
    int k = 0,i;
    ll block = 0;
    for(i = 0; s[i]; i++)
        if(s[i] >= ‘A‘ && s[i] <= ‘Z‘) //如果是字母
        {
            block = block * 100 + (s[i] - ‘A‘) ; //明文对应的数字串
            k++;
            if(k == 4) //够8位数字时
            {
                printf("%08lld", qpow(block, e) % 100000000);//输出密文,这个模不知道是不是必须的,题目没说n的上限
                block = 0;
                k = 0;
            }
        }
    if(k)//剩下的明文要后面补零
    {
        while(k != 4)
        {
            block = block * 100;
            k++;
        }
        printf("%08lld", qpow(block, e) % 100000000);
    }
}
int main()
{
    //  freopen("in.txt", "r", stdin);
    scanf("%lld%lld ", &n, &e);
    gets(plain);
    encrypt(plain);
    return 0;
}

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 << 1], plain[10];
ll exgcd(ll a, ll b)//扩展欧几里德求逆元
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        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 = 1;
    while(b)
    {
        if(b & 1)
            ans = (ans * k ) % n;
        k = ( k * k) % n;
        b >>= 1;
    }
    return ans;
}
void init()//求p和q,和d
{
    int i;
    for(i = 2; i < n; i++)
        if(n % i == 0)
        {
            p = i;
            q = n / i;
            break;
        }
    ll M;
    M = (p - 1) * (q - 1);
    exgcd(e, M);
    d = (x % M + M) % M;//求e的逆元d
}
void decrypt() //解密
{
    ll block = 0;
    int k = 0, i, j;
    for(i = 0; cipher[i]; i++)
    {
        block = block * 10 + cipher[i] - ‘0‘;//密文从字符串中取出来
        k++;
        if(k == 8)//密文达到8位数字时
        {
            memset(plain, 0, sizeof plain);//清空明文字符串
            block = qpow(block, d);//计算明文数字串
            for(j = 3; j >= 0; j--)//每次计算两位数字并存在明文字符串中,因为从后面往前取,所以倒过来存
            {
                plain[j] = block % 100 + ‘A‘;//取最后面两个数字
                block /= 100;//去掉最后面两个数字
            }
            printf("%s", plain);//输出明文
            k = 0;//清空计数器
        }
    }
}
int main()
{
    //  freopen("in.txt", "r", stdin);
    scanf("%lld%lld ", &n, &e);
    gets(cipher);
    init();
    printf("%d\n", d);
    decrypt();
    return 0;
}
时间: 2024-12-19 13:49:24

【kAriOJ】离散数学春季学期编程测试 1的相关文章

回望来时的路:构建之法东北师大站 2016春季学期

1.  前因 微软邹欣老师著有<构建之法:现代软件工程>[https://book.douban.com/subject/26577755/].第一版首版以前,我还不知道邹老师是哪一位,就在网上曾经看到过有人转引他的观点,感到说得太有道理了,一拍大腿的感觉.比如他提到教师和学生之间应该是健身教练和学员间的关系,不是教师带领学生参观浏览,也不是狱警和囚徒的关系.比如他批评没有代码量的软件工程教学.<构建之法>到手,第一遍粗读我花了一周的时间,酣畅淋漓.很多处让你再拍大腿,"

2019春季学期第三周编程总结

实验代码: include <stdio.h> define a 10 int main() { int T,n,i,h,l,j,p; int sz[a][a]; scanf("%d",&T); for(i=1;i<=T;i++) { scanf("%d",&n); for(h=0;h<=n-1;h++) { for(l=0;l<=n-1;l++) scanf("%d",&sz[h][l]);

2019年春季--课前测试感想

开学第一次测试如期而至,本次测试只是在上学期所学基础之上给了两个基础的登陆以及网页分块布局等的模板,让我们在所学基础之上进行套用. 就自身而言,自己刚开始看到这样的要求时,自己是比较高兴的,测试未开始之前,自己觉得应该不是特别的难,自己最初的想法就是把自己所会的知识做出已经有的网页,然后将文件路径加入所给的模板中,但是在实际操作过程中,一个寒假过去了,自己确实在学习上欠缺了许多,在建立工程的过程中都很吃力,出现了很多自己并不知道如何解决的问题. 首先,从最开始注册要求,登陆要求等就遇到很大问题,

结对编程 测试

关于黄金点游戏,我负责测试部分 由于我的队友苏钰涵他用的是VC6.0我用的是Visual studio我们出现过代码在vc上能运行在我这运行错误的情况. 1.vs不支持scanf 2.黄金点输出错误 3.得分第一个恒为人数,最后一个恒为-2 4.在VS上没有输出最后一轮结果和总得分就退出了,没有显示 修改 1.VS支持scanf_S 2.调用求总数的函数时出错 3.添加#include<windows.h>库函数,用system("pause");z执行 一.输入函数,编码

2018年春季学期-助教总结

我很荣幸和感激能在这一学期担任本校软件工程专业2016级“软件工程导论”课程的助教. 18个教学周和两个考试周的时光已经去逝去了,暑期时光也过去一个多周了,这篇总结已经有些迟了.我看了其他助教发布的总结,虽自愧不如,犹豫着拖延着,但终究不可让自己逃避.赶在七月的尾巴根,做个收尾,让这件学期的助教工作有始有终,做个交代.知耻而后勇. 主要工作总结: 代发博客作业4次: 三人分工作业评分4次: 个人项目四则运算自动测试程序编写,代码行800~900: 四人分工个人项目测试: 发布成绩博客1次: 团队

shell脚本编程测试类型下

一bash的数值测试 -v VAR变量VAR是否设置 数值测试:-gt 是否大于greater-ge 是否大于等于-eq 是否等于-ne 是否不等于  not equal-lt 是否小于-le 是否小于等于 -eq是否等于表示变量值是数字,=表示变量值是字符串 [[email protected] ~]# num=10; [[ "$num" -eq 10 ]] && echo true || echo false true [[email protected] ~]#

android编程测试

算法java代码 算法测试java代码 主程序main-activity ResultActivity MainActivity test测试 android界面设计 android界面2设计 原文地址:https://www.cnblogs.com/j511972/p/8921203.html

shell脚本编程测试类型上

一bash的条件测试 判断某需求是否满足,需要由测试机制来实现.专用的测试表达式需要由测试命令辅助完成测试过程. 评估布尔声明,以便用在条件性执行中.若真,则返回0:若假,则返回1. 测试命令:• test EXPRESSION• [ EXPRESSION ]• [[ EXPRESSION ]]和上面两个不同的在于支持正则表达式注意:EXPRESSION前后必须有空白字符 (一)使用test命令 [[email protected] ~]# type test test is a shell b

2020春季学期第八周学习总结

本周学习了python编程的一些常见算法编程实现,总结如下: 1.蒙特·卡罗法计算圆周率 1 import random 2 print("掷飞镖次数:") 3 number = int(input()) 4 k = 0 5 for i in range(1, number + 1): 6 x = random.uniform(-1, 1) # x随机取到-1到1的随机数 7 y = random.uniform(-1, 1) # Y随机取到-1到1的随机数 8 if (x * x +