社区
C++ 语言
帖子详情
编个程序求二元一次不定方程最小正整数解
jandy123
2007-08-30 02:48:15
编个程序求二元一次不定方程最小正整数解
已知 :ax+by=c
求:x最小的正整数解。
输入 a b c
输出 x y (或impossible)
(a,b,c都是整数)
...全文
785
10
打赏
收藏
编个程序求二元一次不定方程最小正整数解
编个程序求二元一次不定方程最小正整数解 已知 :ax+by=c 求:x最小的正整数解。 输入 a b c 输出 x y (或impossible) (a,b,c都是整数)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
chai2010
2007-09-06
打赏
举报
回复
扩展的gcd算法啊
xiaciping
2007-09-01
打赏
举报
回复
学习
jandy123
2007-09-01
打赏
举报
回复
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
long gcd(long a,long b)
{
long c;
if(a<b){a+=b;b=a-b;a-=b;}
while(b!=0)
{
c=b;
b=a%b;
a=c;
}
return a;
}
long findans(long a,long b,long c)
{
long k=0;
if(c%gcd(a,b)!=0)
return -1;
if(a%b==0)
return 1;
bool l=0;
if(a<0){a=-a;l=1;}
if(b<0)b=-b;
_int64 s[3],t[3],r[3],x[3];
x[0]=0;
s[1]=b;t[1]=a%b;
r[1]=s[1]/t[1];
t[2]=s[1]%t[1];
x[1]=1;
while(t[2]!=0)
{
x[2]=x[1]*r[1]+x[0];
x[0]=x[1];
x[1]=x[2];
s[1]=t[1];
t[1]=t[2];
r[1]=s[1]/t[1];
t[2]=s[1]%t[1];
k++;
}
x[1]*=c/gcd(a,b);
if(l ==( k%2==0)){
x[1]=-x[1];
x[1]=x[1]%labs(b)+labs(b);
}
else x[1]%=labs(b);
if(x[1]==0)x[1]=labs(b);
return (long)x[1];
}
int main()
{
long a,b,c,x,y;
scanf("%ld%ld%ld",&a,&b,&c);
x=findans(a,b,c);
if(x==-1){printf("Impossible\n");return 0;}
y=-(a*x-c)/b;
printf("%ld %ld\n",x,y);
return 0;
}
这个算法改了一下。
spofmy
2007-08-31
打赏
举报
回复
顶了
jandy123
2007-08-31
打赏
举报
回复
#include <stdio.h>
#include <math.h>
long gcd(long a,long b)
{
long c=0,d=0;
if(a<b){c=a;a=b;b=c;}
while(b!=0)
{
c=a%b;
a=b;
b=c;
}
return a;
}
bool findans(long a,long b,long c,long *x1,long *y1)
{
if(a%b==0){
if((a-c)%b!=0)return 0;
else
{
x1[0]=b;
y1[0]=(c-a)/b;
return 1;
}
}
if(c%gcd(a,b)!=0)return 0;
_int64 s[3]={0},t[3]={0},q[3]={0},x[3]={0},y[3]={0};
int k=0;
s[0]=a;t[0]=s[1]=b;t[1]=a%b;
q[0]=a/b;q[1]=s[1]/t[1];
x[0]=0;y[0]=1;
x[1]=1;y[1]=q[0];
while(t[1]!=0)
{
t[2]=s[1]%t[1];
s[0]=s[1];s[1]=t[0]=t[1];t[1]=t[2];
q[0]=q[1];
if(t[1]==0)break;
q[1]=s[1]/t[1];
x[2]=x[1]*q[0]+x[0];
y[2]=y[1]*q[0]+y[0];
x[0]=x[1];
y[0]=y[1];
x[1]=x[2];
y[1]=y[2];
k++;
}
x1[0]=(long)(pow(-1,k)*x[1]*c/gcd(a,b));
y1[0]=(long)(pow(-1,k-1)*y[1]*c/gcd(a,b));
return 1;
}
int main()
{
long a,b,c,x,y;
bool l=0,q=0;
scanf("%ld%ld%ld",&a,&b,&c);
if(a<0){l=1;a=-a;}
if(b<0){q=1;b=-b;}
findans(a,b,c,&x,&y);
if(l){x=-x;a=-a;}
if(q){y=-y;b=-b;}
if(x>0){y+=x/b*a;x=x%b;}
else if(x<0){y-=(1-(x/b))*a;x=(x%b)+b;}
if(x==0){x+=b;y-=a;}
printf("%d %d\n",x,y);
return 0;
}
这个程序不知行不?
lin_style
2007-08-30
打赏
举报
回复
昨天刚出了个取模的。。
expter
2007-08-30
打赏
举报
回复
对于LS在枚举?
syy64
2007-08-30
打赏
举报
回复
x = (c-by)/a
当Y大时,X就小,且c〉by
冷月清晖
2007-08-30
打赏
举报
回复
初等数论 先学习下
iatsbg
2007-08-30
打赏
举报
回复
用辗转相除法。参考http://community.csdn.net/Expert/topic/5734/5734611.xml?temp=.7709619
一次
不定
方程
.pdf
这类
方程
的
解
可以通过
求
出
最小
正整数
解
来得到通
解
。
最小
正整数
解
意味着存在一组
正整数
的
解
使得其他所有
解
都可以通过它来表示。 扩展欧几里得算法在
一次
不定
方程
的
求
解
过程中扮演着关键角色,尤其在
求
得一组特
解
上。...
不定
方程
和
解
不定
方程
应用题经典.doc
不定
方程
有很多实际应用,例如
求
3x + 4y = 23 的自然数
解
,
求
4x + 5y = 37 的自然数
解
,
求
5x - 3y = 16 的
最小
自然数
解
等。 四、
不定
方程
的
解
题策略 1. 将原
方程
适当变形,把其中的一个未知数用另一个未知数来...
浙江省绍兴县杨汛桥镇九年级数学竞赛辅导系列讲座三
方程
练习无答案201808274143
17.
不定
方程
的整数
解
:第17题要
求
找到
不定
方程
的
最小
正整数
解
,需要理
解
整数
解
的概念并进行
求
解
。 18. 一元二次
方程
根的个数:第18题根据判别式判断
方程
解
的个数。 19. 一元二次
方程
的非负实根:第19题涉及一元二...
c语言数学应用矩阵整数
求
解
二元
一次
不定
方程
,最大公约及
最小
公倍数,自然对数的底e的计算,正弦、余弦、正切值,
求
等差数列,矩阵的加法运算,矩阵的乘法运算,打印n阶螺旋方阵,
求
33矩阵对角元素之和,
求
车运行速度,卖西瓜,打渔晒网...
关于
不定
方程
x2-Dy4=1 (2001年)
引理1描述了
不定
方程
的全部
正整数
解
可以通过
最小
解
来表达。引理2和引理3则讨论了
解
的特定结构。引理4和引理5涉及到了素数和Pell
方程
解
的关系。 在数学符号方面,出现了诸如Pell
方程
、基本
解
、
最小
解
、四次
不定
方程
...
C++ 语言
65,210
社区成员
250,518
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章