問題描述: 求解 二元一次方程 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 =181+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 ;
}