教学服务系统

 找回密码
 立即注册
搜索
查看: 545|回复: 1

信息计算2019级1班25号王庆海

[复制链接]

11

主题

18

帖子

95

积分

注册会员

Rank: 2

积分
95
发表于 2022-5-3 12:25:14 | 显示全部楼层 |阅读模式
慕课截图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

11

主题

18

帖子

95

积分

注册会员

Rank: 2

积分
95
 楼主| 发表于 2022-5-3 14:53:44 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. /* 函数申明 */
  4. int long_n(int n);
  5. int shuru(char* arr, int k, char* wei, int is_first);
  6. void jiami(char* arr, int k, int e, int n);

  7. /* 输入函数,记录从键盘输入的明文*/
  8. int shuru(char* arr, int k, char* wei, int is_first)
  9. {
  10.         int i;
  11.         char ch;
  12.         /*判断是否为第一分组的输入,如果是则获取输入的字符,否则就将上一分组最后获取的字符作为这一分组的第一个字符*/
  13.         if (is_first == 1)
  14.                 ch = getchar();
  15.         else
  16.                 ch = *wei;
  17.         for (i = 0; (i < k) && (ch != '\n'); i++)  //获取字符直到获取到回车符为止
  18.         {
  19.                 arr[i] = ch;
  20.                 ch = getchar();
  21.         }
  22.         *wei = ch;  //最后获取到的字符准备作为下一分组的第一个字符
  23.         for (i = i; i < k; i++)
  24.                 arr[i] = 'a';  //输入不够一组个数的整数倍则补'a'(即为补零)
  25.         if (ch == '\n')  //接收到回车符返回0,否则为1
  26.                 return 0;
  27.         else
  28.                 return 1;
  29. }

  30. /*加密函数*/
  31. void jiami(char* arr, int k, int e, int n)
  32. {
  33.         int m = 0, c = 1, i, j, t = 0, shu, temp, num = 0;
  34.         int* array;
  35.         /*Mi赋值过程*/
  36.         for (i = 0; i < k; i++)
  37.         {
  38.                 temp = 1;
  39.                 for (j = 0; j < (k - i - 1) * 2; j++)
  40.                         temp = temp * 10;
  41.                 shu = (int)arr[i] - 97;
  42.                 m = m + temp * shu;
  43.         }
  44.         temp = e;
  45.         /*获取e的二进制表达形式的位数*/
  46.         do {
  47.                 temp = temp / 2;
  48.                 num++;
  49.         } while (temp != 0);
  50.         array = (int*)malloc(sizeof(int) * k);   //申请动态数组
  51.         temp = e;
  52.         /*动态数组存储e的二进制表达形式*/
  53.         for (i = 0; i < num; i++)
  54.         {
  55.                 array[i] = temp % 2;
  56.                 temp = temp / 2;
  57.         }
  58.         /*避免出现天文数字的算法,详情见上文文字说明*/
  59.         for (i = num - 1; i >= 0; i--)
  60.         {
  61.                 t = t * 2;
  62.                 temp = c * c;
  63.                 if (temp > n)
  64.                 {
  65.                         for (j = 0; temp - n * j >= 0; j++);
  66.                         j--;
  67.                         c = temp - n * j;
  68.                 }
  69.                 else
  70.                         c = temp;
  71.                 if (array[i] == 1)
  72.                 {
  73.                         t = t + 1;
  74.                         temp = c * m;
  75.                         if (temp > n)
  76.                         {
  77.                                 for (j = 0; temp - n * j >= 0; j++);
  78.                                 j--;
  79.                                 c = temp - n * j;
  80.                         }
  81.                         else
  82.                                 c = temp;
  83.                 }

  84.                 e = e / 2;
  85.         }
  86.         temp = c;
  87.         i = 0;
  88.         /*c的位数小于分组长度则在前补零*/
  89.         do {
  90.                 temp = temp / 10;
  91.                 i++;
  92.         } while (temp != 0);
  93.         for (i; i < num; i++)
  94.                 printf("0");
  95.         printf("%d", c);
  96. }

  97. /*获取分组的长度*/
  98. int long_n(int n)
  99. {
  100.         int temp, i, j, k, shi, comp = 0;
  101.         temp = n;
  102.         /*获取n的位数*/
  103.         for (i = 1; temp / 10 != 0; i++)
  104.         {
  105.                 temp = temp / 10;
  106.         }
  107.         temp = i;
  108.         /*若n的位数为基数*/
  109.         if (i % 2 != 0)
  110.         {
  111.                 i = i - 1;
  112.                 return i;
  113.         }
  114.         /*若位数为偶数*/
  115.         else
  116.         {
  117.                 for (j = 0; j < i / 2; j++)
  118.                 {
  119.                         shi = 1;
  120.                         for (k = 0; k < temp - 2; k++)
  121.                                 shi = shi * 10;
  122.                         comp = comp + shi * 25;
  123.                         temp = temp - 2;
  124.                 }
  125.                 if (comp <= n)
  126.                         return i;
  127.                 else
  128.                 {
  129.                         i = i - 2;
  130.                         return i;
  131.                 }
  132.         }
  133. }

  134. /*主函数*/
  135. int main()
  136. {
  137.         int p, q, e, d, n, fai_n, k, i, is_first = 1;
  138.         char ch, * arr, wei = 'a';
  139.         printf("请输入p、q、e值,用空格间隔开\n");
  140.         scanf_s("%d%d%d", &p, &q, &e);  //从键盘获取p、q、e值
  141.         n = p * q;
  142.         fai_n = (p - 1) * (q - 1);   //Φ(n)
  143.         for (k = 0; (k * n + 1) % e != 0; k++);
  144.         if ((k * n + 1) % e == 0)
  145.                 d = (k * n + 1) / e;  //d * e ≡ 1 (mod Φ(n))
  146.         k = long_n(n);
  147.         k = k / 2;  //分组的长度
  148.         ch = getchar(); //缓冲回车符
  149.         arr = (char*)malloc(sizeof(char) * k);  //申请动态数组
  150.         printf("请输入明文\n");
  151.         while (1)
  152.         {
  153.                 i = shuru(arr, k, &wei, is_first);  //调用输入字符的函数,接收到回车符返回0,否则为1
  154.                 is_first = 0;  //第一分组录入结束设为0
  155.                 jiami(arr, k, e, n);  //调用加密函数
  156.                 if (i == 0)  //接收到返回值为0跳出循环
  157.                         break;
  158.         }
  159.         printf("\n");
  160.         return 0;
  161. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

教学服务系统

GMT+8, 2025-4-30 11:18 , Processed in 0.015486 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表