怎么用C语言解多元一次方程?需要得到最合适的解。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用C语言解多元一次方程?需要得到最合适的解。相关的知识,希望对你有一定的参考价值。

如:1000a+500b+300c+200d+100e+50f+10g=1980

求a,b,c,d,e,f,g的最合适的解(要求能用大的未知数的倍数就用大的)
即此时a=1,b=1,c=1,d=0,e=1,f=1,g=3为最合适的解。
(1000*1+500*1+300*1+200*0+100*1+50*1+10*3=1980)

多元一次方程, 需要建方程组,解线性方程组得解。
有几个变量就需要几个方程。
解线性方程组的方法很多,例如高斯消去法。

“最合适的解” -- 什么叫最合适,要用一个一个方程描述/写出来。
方程个数少于变量个数时得无穷个解。
参考技术A 很简单你只需写一个自定义规则来判断不就行了吗?追问

就是不知道如何判断

本回答被提问者采纳

方程的解

  总之这题如果静下心来仔细想,拿个80分并不难

  问题:扩欧只会板子,并未理解,扩欧解出来的是一组解而已,并没有最值等的特殊性。

  ax+by=c必须在c能整除gcd(a,b)的情况下,此时会有n多组解,设d=gcd(a,b);x=(c/d)*x0+k*(b/d),y=(c/d)*x0-k*(a/d);

  这题还是值得好好看看,因为特判情况可以搞到许多分。包括数据范围的特判,解的个数的特判。  

技术图片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cmath>
 5 #define xian 65535
 6 #define ll long long
 7 using namespace std;
 8 inline ll read()
 9     ll s=0,w=1;char ch=getchar();
10     while(ch<0||ch>9)if(ch==-)w=-1;ch=getchar();
11     while(ch>=0&&ch<=9)s=s*10+ch-0,ch=getchar();
12     return s*w;
13 
14 
15 ll T;
16 ll a,b,c;
17 ll ltmp;
18 ll exgcd(ll a,ll b,ll &x,ll &y)
19     if(!b)
20         x=1;y=0;
21         return a;
22     
23     ll lgcd=exgcd(b,a%b,x,y);
24     ltmp=x;
25     x=y;
26     y=ltmp-a/b*y;
27     return lgcd;
28 
29 
30 int main()
31 //    freopen("da.in","r",stdin);
32 //    freopen("te.out","w",stdout);
33     T=read();
34     while(T)
35         --T;
36         a=read();b=read();c=read();
37         //cout<<c<<endl;
38 
39         if(a==0&&b==0)
40             if(!c)puts("ZenMeZheMeDuo");continue; 
41             elseputs("0");continue; 
42         
43         if(!a)
44             if(c*b<0)puts("0");continue; 
45             else
46                 if(!c)puts("0");continue; 
47                 if(c%b)puts("0");continue; 
48                 elseputs("ZenMeZheMeDuo");continue; 
49             
50         
51         if(!b)
52             if(c*a<0)puts("0");continue; 
53             else
54                 if(!c)puts("0");continue; 
55                 if(c%a)puts("0");continue; 
56                 elseputs("ZenMeZheMeDuo");continue; 
57             
58         
59 
60         if(a+b==c)puts("1");continue; 
61         if(a<0)a*=-1,b*=-1,c*=-1;
62         if(b>0&&c<0)puts("0");continue; 
63         if(b>0&&c>0)
64             if(a==1&&b==1)
65                 if(c-1>xian)puts("ZenMeZheMeDuo");
66                 else printf("%lld\n",(c-1));
67                 continue;
68             
69         
70 
71         ll x,y;
72         ll lin=exgcd(a,b,x,y);
73 
74         if(c%lin)puts("0");continue; 
75         if(a*b<0)puts("ZenMeZheMeDuo");continue; 
76 
77         ll xi=c/lin;
78         x*=xi;y*=xi;
79 
80         if(x==0&&y==0)puts("0");continue; 
81         if(x<0&&y<0)puts("0");continue; 
82 
83         ll jx=b/lin,jy=a/lin;
84         ll ans=0;
85 
86         if(x<=0)ans=ceil(y*1.0/jy)-1-(-1*x/jx);
87         else if(y>=0)ans=ceil(x*1.0/jx)-1-(-1*y/jy);
88         else ans=ceil(x*1.0/jx)-1+ceil(1.0*y/jy);
89 
90         if(ans<=0)puts("0");continue; 
91         if(ans>xian)puts("ZenMeZheMeDuo");continue; 
92 
93         printf("%lld\n",ans);
94     
95     return 0;
96 
View Code

以上是关于怎么用C语言解多元一次方程?需要得到最合适的解。的主要内容,如果未能解决你的问题,请参考以下文章

用c语言编程求线性方程组的解

matlab怎么求多元一次方程组

怎么去解多元一次方程组快

用C语言编写程序实现一元二次方程的解?

matlab解多元方程组?谢谢六元方程组

如何解多元一次和二次方程