PC/UVa 题号: 110703/1014 Euclid Problem

该博客讨论了如何在C语言中解决寻找X和Y,使得A*X+B*Y等于A和B的最大公约数(gcd)的问题。博主强调了在处理大整数时避免越界,并指出PC编译器可能不支持__int64类型,建议包含必要的头文件以避免编译错误。文中提供了一个使用递归实现gcd的代码示例,并在主函数中读取输入,输出相应的X、Y和gcd的值。
摘要由CSDN通过智能技术生成
 

对于任意正整数 A B<1000000001寻找X Y使得 A*X+B*Y=gcd(A,B);要注意越界问题,所以用long long  PC的编译器不支持__int64 用c语言比较麻烦,最好把经常用的几个头文件都加上否则编译错误

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;

根据数论只是,任何整数A,B,都存在这样一对X,Y 使得A*X+B*Y=gcd(A,B);成立(理论不推了,看我的博客“整除性”里面有讲解)

代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
long long gcd(long long p,long long q,long long &x,long long &y)
{
 long long x1,y1;
 long long g;
 if(q>p) return gcd(q,p,y,x);
 if(q==0)
 {
  x=1;
  y=0;
  return p;
 }
 g=gcd(q,p%q,x1,y1);
 x=y1;
 y=(x1-floor(p/q)*y1);
 return g;
}
int main()
{
 long long a,b;
 while(scanf("%lld%lld",&a,&b)!=EOF)
 {
  long long t,x,y;
  t=gcd(a,b,x,y);
  printf("%lld %lld %lld\n",x,y,t);
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值