求二元一次方程 的解 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 · 訪問量 4189
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章