日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【kAriOJ】离散数学春季学期编程测试 1

發布時間:2025/7/14 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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; }

?

總結

以上是生活随笔為你收集整理的【kAriOJ】离散数学春季学期编程测试 1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。