求二元一次方程 的解 C语言

问题描述: 求解 二元一次方程 ax + by=c的解 ,其中a,b,c是从键盘中输入,a>b>0.
问题分析: 如果 单纯做 数学题的话,列出 方程组,使用加减消元法就可以了,迁移到 编程中 ,变量 X,Y本身 未知,需要 求出。若使用穷举法,耗费内存,而且这种方法 限制了 数据大小。无法 在 今后工作使用。

记住 求解这类方程的 两个重要 结论

二元一次不定方程有解 的充分必要条件 是 a 与 b 的最大 公约数 能整除 c
若(x1,y1)是方程 的一组解,则对任何整数K,(x1 + bK,y1-aK)也都是方程的解

下面是 示例123X+35Y=7 和推导
123 = 353+18
35 =18
1+17
17 =1*17
将其 用公式转化 :

An = Bn * Cn + Dn;
Cn = An /Bn;
Dn = An % Bn;
A(n+1) = Bn;
B(n+1) =Dn;
X[n] 和 Y[n] 的 递推计算公式 如下:
X[0]=0,X[1]=1, X[n+1] = X[n] *Q[n] + X[n-1] (i > 1)
Y[0] =1,Y[1]= Q[0],Y[n+1]=Y[n]Q[n]+Y[n-1] (i > 1)
最终方程解 为 X = (-1)^(n-1) * X[n],Y=(-1)^n
*Y[n]
这里 的n就是计算的轮数。

#include <stdio.h>
void result (int a,int b,int c,int *x2,int *y2)
{
	int x[100],y[100],z[100];
	int i,j,d,t,gcd;
	x[0]=0;
	y[0]=1;
	for (i=0;i<100;i++)
		{
			z[i]= a/b;
			d = a%b;
			a=b;
			b=d;
			if (d==0)
				{
					gcd=a;
					break;
				}
			if(i==0)
				{
					x[1]=1;
					y[1]=z[0];
				}
			else
				{
					x[i+1]=z[i]*x[i]+x[i-1];
					y[i+1]=z[i]*y[i]+y[i-1];
				}
		}
	for (t=-1,j=1;j<i;j++)
		t=-t;
		*x2=-t*x[i];
		*y2=t*y[i];
	if (c%gcd != 0)
		{
			printf("该方程无解!\n");
		}
	t = c/gcd;
	*x2 = *x2*t;
	*y2 = *y2*t;
}
void test (int a,int b,int c,int x,int y)
{
	if (a*x+b*y==c)
		printf("结果正确!\n");
	else
		printf("结果错误!\n");
}
void main()
{
	int a,b,c;
	int x2,y2;
	printf("该程序执行操作是ax + by = c的");
	printf("输入 a,b,c: \n");
	scanf("%d,%d,%d",&a,&b,&c);
	result(a,b,c,&x2,&y2);
	printf("x2=%d, y2=%d\n",x2,y2);
	
	return ;
}

发布了34 篇原创文章 · 获赞 2 · 访问量 4237

猜你喜欢

转载自blog.csdn.net/myxk_/article/details/104266325
今日推荐