egcd

egcd。
#include<iostream>
using namespace std;
int egcd(int a,int b,int &x,int &y)
{
  if(b==0)
  {
    x=1;
    y=0;
    return a;
  }
  int gcd=egcd(b,a%b,y,x);
  y-=a/b*x;
  return gcd;
}
int main()
{
  int a,b,d,x,y,gcd;
  cin>>a>>b>>d;
  gcd=egcd(a,b,x,y);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
修复下面代码错误:char s[100],c[100]; int n,e,d,i,C,j,k=0,len; int str[100],b[30],ming[100]; unsigned ged(unsigned a,unsigned b) { if(a%b==0) return b; else return ged(b,a%b); } void Egcd(int a,int b,int&x,int &y) { if(b==0||a==0) { x=1; y=0; return; } if(a<b) { Egcd(a,b%a,x,y); x=(int)(b*y+1)/a; } else { Egcd(a%b,b,x,y); y=(int)(a*x-1)/b; } } void RSA() { int p,q,N,Y; printf("请输入素数p和q:"); scanf("%d%d",&p,&q); n=p*q; N=(p-1)*(q-1); srand((unsigned)time(NULL)); while(1) { e=rand()%N; if(e==0) continue; if(ged(N,e)==1) { break; } } Egcd(e,N,d,Y); } void encrypt() { len=strlen(s); for(i=0;i<len;i++) { ming[i]=s[i]-97; } printf("\n"); printf("加密开始………………………………\n"); for(i=0;i<len;i++) { C=1; for(int j=0;j<e;j++) { C=(C*(s[i]-97))%n; } str[i]=C; } printf("加密结果为:\n"); for(int i=0;i<len;i++) printf("%d",str[i]); printf("\n加密结束………………………………\n"); } void decrypt() { //c=(char*)malloc(len*sizeof(int)); for(i=0;i<len;i++) { C=1; for(int j=0;j<d;j++) { C=(C*(str[i]))%n; } c[i]=C+97; } c[i]='\0'; for (int z = 0; z < k; z++) { for (i = 0; i < len; i++) { if (i == b[z]) { for (j = len; j > i; j--) { c[j] = c[j - 1]; } c[i] = ' '; len++; for (int p = z + 1; p < k; p++) { b[p]++; } break; } } } c[len]='\0'; printf("\n解密开始……………………………\n"); printf("解密结果为:\n"); puts(c); printf("解密结束……………………………\n"); } int function() { int choice; printf("====================================\n"); printf(" 1--加密 \n"); printf(" 2--解密 \n"); printf(" 3--退出 \n"); printf("====================================\n"); printf("请输入要选择的功能:"); scanf("%d",&choice); return choice; } int main() { int function(); int fc; printf("请输入初始明文:"); fgets(s, 100, stdin); RSA(); while(1) { fc=function(); if(fc==1) encrypt(); else if(fc==2) decrypt(); else if(fc==3) break; else printf("输入错误,请重新输入!/n"); } return 0; }
06-01
修复代码错误如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> char s[100], c[100]; int n, e, d, i, C, j, k = 0, len; int str[100], b[30], ming[100]; unsigned ged(unsigned a, unsigned b) { if (a % b == 0) return b; else return ged(b, a % b); } void Egcd(int a, int b, int& x, int& y) { if (b == 0 || a == 0) { x = 1; y = 0; return; } if (a < b) { Egcd(b % a, a, y, x); y = (int)(b - a * x) / a; } else { Egcd(b, a % b, x, y); x = (int)(b * y + a - 1) / a; } } void RSA() { int p, q, N, Y; printf("请输入素数p和q:"); scanf("%d%d", &p, &q); n = p * q; N = (p - 1) * (q - 1); srand((unsigned)time(NULL)); while (1) { e = rand() % N; if (e == 0) continue; if (ged(N, e) == 1) { break; } } Egcd(e, N, d, Y); } void encrypt() { len = strlen(s) - 1; for (i = 0; i < len; i++) { ming[i] = s[i] - 97; } printf("\n加密开始………………………………\n"); for (i = 0; i < len; i++) { C = 1; for (j = 0; j < e; j++) { C = (C * ming[i]) % n; } str[i] = C; } printf("加密结果为:\n"); for (int i = 0; i < len; i++) printf("%d", str[i]); printf("\n加密结束………………………………\n"); } void decrypt() { len = strlen(s) - 1; // c=(char*)malloc(len*sizeof(int)); for (i = 0; i < len; i++) { C = 1; for (j = 0; j < d; j++) { C = (C * str[i]) % n; } c[i] = C + 97; } c[i] = '\0'; for (int z = 0; z < k; z++) { for (i = 0; i < len; i++) { if (i == b[z]) { for (j = len; j > i; j--) { c[j] = c[j - 1]; } c[i] = ' '; len++; for (int p = z + 1; p < k; p++) { b[p]++; } break; } } } c[len] = '\0'; printf("\n解密开始……………………………\n"); printf("解密结果为:\n"); puts(c); printf("解密结束……………………………\n"); } int function() { int choice; printf("====================================\n"); printf(" 1--加密 \n"); printf(" 2--解密 \n"); printf(" 3--退出 \n"); printf("====================================\n"); printf("请输入要选择的功能:"); scanf("%d", &choice); getchar(); // 加上这个清除缓冲区中的换行符 return choice; } int main() { RSA(); printf("请输入初始明文:"); // 用fgets代替scanf,因为scanf会把输入缓冲区中的换行符留在缓冲区中,导致后面的fgets读取到空行 fgets(s, 100, stdin); while (1) { int fc = function(); if (fc == 1) encrypt(); else if (fc == 2) decrypt(); else if (fc == 3) break; else printf("输入错误,请重新输入!\n"); } return 0; } ``` 主要修正如下: 1. 在调用`Egcd`函数时,交换了参数。 2. 在`Egcd`函数中,计算`x`和`y`的表达式有误。 3. 在`encrypt`函数中,`len`应该是`strlen(s)-1`,因为`fgets`函数读取的字符串会包含换行符。 4. 在`function`函数中,需要用`getchar`函数清除缓冲区中的换行符,以免干扰后面的`fgets`函数。 5. 在`main`函数中,需要用`fgets`函数代替`scanf`函数读取字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值